Fredwriter
|
|
« : 27-10-2011 18:08 » |
|
Здравствуйте, такая прямо беда со мной приключилась, написал по книге простейший драйвер, да вот компилятор ошибку выдаёт (ваще её там не должно быть!). Вот текст где ошибки (функция DriverEntry) DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateMyDriver; DriverObject->MajorFunction[IRP_MJ_READ] = ReadMyDriver; DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteMyDriver; DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ShutdownMyDriver; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlMyDriver; DriverObject->DriverUnload = MyDriverUnload; В книге Уолтера Они "Использование Microsoft Windows Driver Model (WDM)" ясно описана, вся структура данных DriverObject и там есть такая штука, как MajorFunction, а компилятор на эти строки ругается, что мол: assignment from incompatible pointer type. А вот весь этот простой текст драйвера. #include <ntddk.h> #include <MyDriverMessages.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS WriteMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS ShutdownMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS CleanupMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS IoCtlMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
VOID MyDriverUnload (IN PDRIVER_OBJECT DeviceObject);
BOOLEAN GetMessage(IN NTSTATUS ErrorCode, IN PVOID IoObject, IN PIRP Irp);
#ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, GetMessage) #endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{ UNICODE_STRING nameString, linkString; PDEVICE_OBJECT deviceObject; NTSTATUS status; GetMessage(MSG_DRIVER_ENTRY, DriverObject, NULL); RtlInitUnicodeString(&nameString, L"\\Device\\MyDriver"); status = IoCreateDevice(DriverObject, sizeof(65533), &nameString, 0, 0, FALSE, &deviceObject); if (!NT_SUCCESS(status)) return status; deviceObject->Flags |= DO_DIRECT_IO; deviceObject->Flags &= ~DO_DEVICE_INITIALIZING; RtlInitUnicodeString(&linkString, L"\\DosDevices\\MyDriver"); status = IoCreateSymbolicLink(&linkString, &nameString); if (!NT_SUCCESS(status)) { IoDeleteDevice(DriverObject->DeviceObject); return status; } DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateMyDriver; DriverObject->MajorFunction[IRP_MJ_READ] = ReadMyDriver; DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteMyDriver; DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ShutdownMyDriver; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlMyDriver; DriverObject->DriverUnload = MyDriverUnload; return STATUS_SUCCESS; }
NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_CREATE, (PVOID)DeviceObject, NULL); IoCompleteRequest(Irp, IO_NO_INCREMENT); Return STATUS_SUCCESS; }
NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_READ, DeviceObject, NULL); return STATUS_SUCCESS; } NTSTATUS WriteMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_WRITE, DeviceObject, NULL); return STATUS_SUCCESS; }; NTSTATUS ShutdownMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_SHUTDOWN, DeviceObject, NULL); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS IoCtlMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_IOCTL, DeviceObject, NULL); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } VOID MyDriverUnload (IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING linkString; GetMessage(MSG_DRIVERUNLOAD, DriverObject, NULL); RtlInitUnicodeString(&linkString, L"\\DosDDevices\\MyDriver"); IoDeleteSymbolicLink(&linkString); IoDeleteDevice(DriverObject->DeviceObject); }
BOOLEAN GetMessage(IN NTSTATUS ErrorCode, IN PVOID IoObject, IN PIRP Irp) { PIO_ERROR_LOG_PACKET Log_Packet; PIO_STACK_LOCATION IrpStackLocation; PWCHAR pInsertString; STRING AnsiInsertString; UNICODE_STRING UniInsertString; UCHAR Size_of_Packet; Size_of_Packet = sizeof(IO_ERROR_LOG_PACKET); Log_Packet = IoAllocateErrorLogEntry(IoObject, Size_of_Packet); If (Log_Packet == NULL) return FALSE; Log_Packet->ErrorCode = ErrorCode; Log_Packet->UniqueErrorValue = 0; Log_Packet->RetryCount = 0; Log_Packet->SequenceNumber = 0; Log_Packet->IoControlCode = 0; Log_Packet->DumpDataSize = 0; if (Irp != NULL) { IrpStackLocation = IoGetCurrentIrpStackLocation(Irp); Log_Packet->MajorFunctionCode = IrpStackLocation->MajorFunction; Log_Packet->FinalStatus = Irp->IoStatus.Status; } else { Log_Packet->MajorFunctionCode = 0; Log_Packet->FinalStatus = 0; } IoWriteErrorLogEntry(Log_Packet); return TRUE; }
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #1 : 27-10-2011 20:54 » |
|
с ходу вроде проблем в коде не видно. настройки компилятора какие? _stdcall? x64 случайно? MajorFunction[] - какой тип имеет? видимо PDRIVER_DISPATCH. как он определен? а то дома посмотреть негда)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #2 : 28-10-2011 02:15 » |
|
с ходу вроде проблем в коде не видно. настройки компилятора какие? _stdcall? x64 случайно? MajorFunction[] - какой тип имеет? видимо PDRIVER_DISPATCH. как он определен? а то дома посмотреть негда)
Ochkarik, насчет компилятора не знаю (как узнать можно и как настроить то что нужно?), а MajorFunction это одно из полей структуры PDRIVER_OBJECT - массив PDRIVER_DISPATCH, который содержит таблицу указателей на функции ввода вывода драйвера, она у меня заполняется именно там где ошибка. Вот не пойму откуда ж ошибка то?
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
|
Fredwriter
|
|
« Ответ #4 : 29-10-2011 13:49 » |
|
Скачал Microsort Visual Studio 2008 Express Edition, затем настроил проект, как было указано для, VS 2005, но при Build-инге сначало вылезло окно где нужно было выбрать из списка, где была только, regsvr32.exe, а затем окно с ошибкой не указано имя dll я убрал галку - показывать это окно каждый раз при запуске, подскажите пожалуйста, что нужно было выбрать, и где в настройках эту галку опять поставить?
Добавлено через 4 часа, 34 минуты и 15 секунд: Заново создал проект, опять его настроил под VS 2005, при компиляции появляется окно: Executable For Debug Session (я так понял выбрать .exe для отладочной сессии) там можно выбрать либо regsvr32.exe либо самому указать exe-шник, что это значит? Buildlog.htm постоянно одно и тоже: либо он не может найти ntddk.h, либо для stdafx.h не может найти atlbase.h. Я настроил переменную окружения но в Buildlog.htm ошибка: 1>Project : warning PRJ0018 : The following environment variables were not found: 1>$(BASEDIRXP) Вот текст Buildlog.htm: 1>------ Build started: Project: MyDriver, Configuration: Debug Win32 ------ 1>Compiling... 1>MyDriver.c 1>d:\программирование1\myfirstdriver\mydriver\stdafx.h(13) : fatal error C1083: Cannot open include file: 'atlbase.h': No such file or directory 1>Project : warning PRJ0018 : The following environment variables were not found: 1>$(BASEDIRXP) 1>Build log was saved at "file://d:\Программирование1\MyFirstDriver\MyDriver\Debug\BuildLog.htm" 1>MyDriver - 1 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== помогите пожалуйста настроить проект и скомпилировать уже в конце концов этой долгожданный файл MyFirstDriver.sys. Это самое долгое мучение, каторое я когда либо испытывал.
|
|
« Последнее редактирование: 29-10-2011 18:23 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #5 : 29-10-2011 18:33 » |
|
по поводу Executable For Debug Session: http://msdn.microsoft.com/en-us/library/44t4z67c(VS.80).aspxвы пытаетесь драйвер прям из студии запустить, как простое приложение? Добавлено через 1 минуту и 24 секунды:" либо он не может найти ntddk.h, либо для stdafx.h не может найти atlbase.h" что значит "либо"?)
|
|
« Последнее редактирование: 29-10-2011 18:34 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #6 : 29-10-2011 19:04 » |
|
"либо" - значит если подключить ntddk.h то не может найти ntddk.h вот Buildlog.htm для этого случая: 1>------ Build started: Project: MyDriver, Configuration: Debug Win32 ------ 1>Compiling... 1>MyDriver.c 1>.\MyDriver.c(1) : fatal error C1083: Cannot open include file: 'ntddk.h': No such file or directory 1>Project : warning PRJ0018 : The following environment variables were not found: 1>$(BASEDIRXP) 1>Build log was saved at "file://d:\Программирование1\MyFirstDriver\MyDriver\Debug\BuildLog.htm" 1>MyDriver - 1 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== , а если stdafx.h, то Buildlog.htm я уже показывал. вы пытаетесь драйвер прям из студии запустить, как простое приложение? нет я мечтаю собрать свой первый драйвер вот уже неделю Добавлено через 45 минут: Добавлено через 41 минуту и 4 секунды:Cейчас выдаёт следующую ошибку: 1>C:\WinDDK\7600.16385.1\inc\api\sdkddkver.h(246) : fatal error C1012: unmatched parenthesis : missing ')'
|
|
« Последнее редактирование: 29-10-2011 19:45 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #7 : 29-10-2011 21:10 » |
|
извините за дурацкий вопрос... а вы раньше приложения на c/с++ писали? много? что именно?(я на всякий случай) я к тому, что может перед написанием драйвера стоит в области простых приложений попрактиковаться? 1>.\MyDriver.c(1) : fatal error C1083: Cannot open include file: 'ntddk.h': No such file or directory 1>Project : warning PRJ0018 : The following environment variables were not found: 1>$(BASEDIRXP)
о чем говорит эта ошибка? PS запустите из меню винды Пуск->DDK->Build Environment for ..... (как-то так) откроется консоль с нужными переменными окружения. в этой консоли, зайдите в каталог \DDK\src\какой нибудь пример наберите build.exe вуаля - ваш первый пример скомпилирован)
|
|
« Последнее редактирование: 29-10-2011 21:19 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #8 : 29-10-2011 21:48 » |
|
извините за дурацкий вопрос... а вы раньше приложения на c/с++ писали? много? что именно?(я на всякий случай) я к тому, что может перед написанием драйвера стоит в области простых приложений попрактиковаться? Немного попрактиковался в Dev-Cpp, там всё как-то проще, первый раз пользуюсь VS, практиковаться дальше мне некогда, нужно курсач делать. Раньше писал на Delphi, поэтому опыт в принципе приложения писать у меня есть. о чем говорит эта ошибка? Эта ошибка говорит о том, что не определена переменная окружения BASEDIRXP, а я её определил следующим образом: в cmd написал: set BASEDIRXP=C:\WinDDK\7600.16385.1, правильно неправильно не знаю в инете нашел что нужно так. запустите из меню винды Пуск->DDK->Build Environment for ..... (как-то так) откроется консоль с нужными переменными окружения. в этой консоли, зайдите в каталог \DDK\src\какой нибудь пример наберите build.exe вуаля - ваш первый пример скомпилирован) У меня DDK 7600.16385.1 (качал с сайта Microsoft) как-то не так встал, поэтому в пуске нет Build Environment for ....., но мне на одном форуме подсказали сделать так: @echo off C:\Windows\System32\cmd.exe /k C:\WinDDK\bin\setenv.bat C:\WinDDK\ fre x86 WINXP консолька создалась, но драйвер, когда я зашел в свою паку и набрал Build, не собрался. Сначала был DDK 2600, и он нормально вставал, но тоже не собирал. зайдите в каталог \DDK\src\какой нибудь пример Мне нужно свой драйвер скомпилировать. Я хочу из сдудии скомпилировать, там же всё можно настроить, вы же мне сами ссылку дали. Уже скоро себе мозг вынесу , в делфе вообще таких проблем не было, хотя сначала всегда трудно.
|
|
« Последнее редактирование: 29-10-2011 21:50 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Fredwriter
|
|
« Ответ #9 : 30-10-2011 13:07 » |
|
помогите люди добрые, уже чё только не делал, скачал древний Visual c++ 6.0, и настроил проект как для 6.0 из ссылки которую мне давал Ochkarik, но ни чего не получается. Удалил DDK 7600.16385.1, поставил 2600, пытался опять Build Environment'ом: зашел в папку c проектом, Добавил туда Makefile, и Source следующего содержания: MakeFile: !INCLUDE $(NTMAKEENV)\makefile.def Source: TARGETNAME = MYDRIVER TARGETTYPE = DRIVER #DRIVERTYPE = WDM TARGETPATH = obj SOURCES = MyDriver.c MyDriverMessages.rc C_DEFINES = -DUNICODE -DSTRICT Содержание файла C: #include <ntddk.h> #include <MyDriverMessages.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
__stdcall NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
__stdcall NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
__stdcall NTSTATUS WriteMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
__stdcall NTSTATUS ShutdownMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS CleanupMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
__stdcall NTSTATUS IoCtlMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
__stdcall VOID MyDriverUnload (IN PDRIVER_OBJECT DeviceObject);
BOOLEAN GetMessage(IN NTSTATUS ErrorCode, IN PVOID IoObject, IN PIRP Irp);
#ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, GetMessage) #endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{ UNICODE_STRING nameString, linkString; PDEVICE_OBJECT deviceObject; NTSTATUS status; GetMessage(MSG_DRIVER_ENTRY, DriverObject, NULL); RtlInitUnicodeString(&nameString, L"\\Device\\MyDriver"); status = IoCreateDevice(DriverObject, sizeof(65533), &nameString, 0, 0, FALSE, &deviceObject); if (!NT_SUCCESS(status)) return status; deviceObject->Flags |= DO_DIRECT_IO; deviceObject->Flags &= ~DO_DEVICE_INITIALIZING; RtlInitUnicodeString(&linkString, L"\\DosDevices\\MyDriver"); status = IoCreateSymbolicLink(&linkString, &nameString); if (!NT_SUCCESS(status)) { IoDeleteDevice(DriverObject->DeviceObject); return status; } DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateMyDriver; DriverObject->MajorFunction[IRP_MJ_READ] = ReadMyDriver; DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteMyDriver; DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ShutdownMyDriver; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlMyDriver; DriverObject->DriverUnload = MyDriverUnload; return STATUS_SUCCESS; }
__stdcall NTSTATUS CreateMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_CREATE, (PVOID)DeviceObject, NULL); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }
__stdcall NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_READ, DeviceObject, NULL); return STATUS_SUCCESS; } __stdcall NTSTATUS WriteMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_WRITE, DeviceObject, NULL); return STATUS_SUCCESS; }; __stdcall NTSTATUS ShutdownMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_SHUTDOWN, DeviceObject, NULL); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } __stdcall NTSTATUS IoCtlMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { GetMessage(MSG_IOCTL, DeviceObject, NULL); IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } __stdcall VOID MyDriverUnload (IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING linkString; GetMessage(MSG_DRIVERUNLOAD, DriverObject, NULL); RtlInitUnicodeString(&linkString, L"\\DosDDevices\\MyDriver"); IoDeleteSymbolicLink(&linkString); IoDeleteDevice(DriverObject->DeviceObject); }
BOOLEAN GetMessage(IN NTSTATUS ErrorCode, IN PVOID IoObject, IN PIRP Irp) { PIO_ERROR_LOG_PACKET Log_Packet; PIO_STACK_LOCATION IrpStackLocation; PWCHAR pInsertString; STRING AnsiInsertString; UNICODE_STRING UniInsertString; UCHAR Size_of_Packet; Size_of_Packet = sizeof(IO_ERROR_LOG_PACKET); Log_Packet = IoAllocateErrorLogEntry(IoObject, Size_of_Packet); if (Log_Packet == NULL) return FALSE; Log_Packet->ErrorCode = ErrorCode; Log_Packet->UniqueErrorValue = 0; Log_Packet->RetryCount = 0; Log_Packet->SequenceNumber = 0; Log_Packet->IoControlCode = 0; Log_Packet->DumpDataSize = 0; if (Irp != NULL) { IrpStackLocation = IoGetCurrentIrpStackLocation(Irp); Log_Packet->MajorFunctionCode = IrpStackLocation->MajorFunction; Log_Packet->FinalStatus = Irp->IoStatus.Status; } else { Log_Packet->MajorFunctionCode = 0; Log_Packet->FinalStatus = 0; } IoWriteErrorLogEntry(Log_Packet); return TRUE; }
В папке еще были файлы MyDriverMessages.h и MyDriverMessages.rc, созданные из файла MyDriverMessages.mc утилитой mc из пакета DDK. вот содержание файла MyDriverMassages.mc: MessageID = 1 Severity = Informational SymbolicName = MSG_DRIVER_ENTRY Language = English Driver Entry . MessageID = 2 Severity = Informational SymbolicName = MSG_CREATE Language = English Create . MessageID = 3 Severity = Informational SymbolicName = MSG_READ Language = English Read . MessageID = 4 Severity = Informational SymbolicName = MSG_WRITE Language = English Write . MessageID = 5 Severity = Informational SymbolicName = MSG_SHUTDOWN Language = English Shutdown . MessageID = 6 Severity = Informational SymbolicName = MSG_IOCTL Language = English IoCtl . MessageID = 7 Severity = Informational SymbolicName = MSG_DRIVERUNLOAD Language = English Unload . В общем в папке были файлы MyDriver.c, MyDriverMessages.rc, MyDriverMessages.h, MakeFile, Source. Не собралось Вот что говорил Build.exe при моей попытке собрать: BUILD: Object root set to: ==> objfre BUILD: Adding /Y to COPYCMD so xcopy ops won't hang. BUILD: /i switch ignored BUILD: Using 2 child processes BUILD: Compile and Link for i386 BUILD: Loading C:\WINDDK\2600\build.dat... BUILD: Computing Include file dependencies: BUILD: Saving C:\WINDDK\2600\build.dat... BUILD: Done Помогите пожалуйста, еще раз прошу. И еще подскажите пожалуйста как настроить переменные окружения, а то когда я настраиваю из командной строки командой Set BASEDIRXP=<нужный путь>, то каждый раз пишет ошибку: The following environment variables were not found $(BASEDIRXP).
|
|
« Последнее редактирование: 30-10-2011 15:10 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #10 : 30-10-2011 20:26 » |
|
выкладывайте все в архиве. либо проект VS либо для Build либо и то и то. завтра на работе если будет время - гляну.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #11 : 31-10-2011 00:32 » |
|
С переменной окружения разобрался, нужно было (если кому пригодится) Мой компьютер->свойства->дополнительно->Переменные среды->системные. После этого я обнаружил, что версия компилятора Visual C++ 6.0 Professional Edition, который я скачал не поддерживает DDK, мне компилятор так и сказал. Буду опять устанавливать VS2008.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #12 : 31-10-2011 02:13 » |
|
да, помоему для VS 6 версии я заменял компилятор студии - компилятором из DDK. просто скопировал в папку студии его, и его dll-ки. но уже не помню подробностей. Добавлено через 9 часов, 20 минут и 58 секунд:файл должен называться "sources" а не "source" PS и уберите обратно все stdcall) и будет вам счастье... C:\temp\MyFirstDriver>build path contains nonexistant c:\utils, removing BUILD: Compile and Link for x86 BUILD: Loading c:\ddk\6001.18001\build.dat... BUILD: Computing Include file dependencies: BUILD: Start time: Mon Oct 31 15:32:37 2011 BUILD: Examining c:\temp\myfirstdriver directory for files to compile. BUILD: Saving c:\ddk\6001.18001\build.dat... BUILD: Compiling and Linking c:\temp\myfirstdriver directory _NT_TARGET_VERSION SET TO WINXP Compiling resources - mydrivermessages.rc Compiling - mydriver.c Linking Executable - objchk_wxp_x86\i386\mydriver.sys BUILD: Finish time: Mon Oct 31 15:32:38 2011 BUILD: Done
4 files compiled - 2 Warnings 1 executable built
|
|
« Последнее редактирование: 31-10-2011 11:34 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #13 : 31-10-2011 14:19 » |
|
Огромейшее, огроменное вам спасибо, вы не представляете .... В общем спасибо большое. Век не забуду. Ураааааа! C:\Dev-Cpp>cd MyFirstDriver
C:\Dev-Cpp\MyFirstDriver>build BUILD: Object root set to: ==> objfre BUILD: Adding /Y to COPYCMD so xcopy ops won't hang. BUILD: /i switch ignored BUILD: Using 2 child processes BUILD: Compile and Link for i386 BUILD: Loading C:\WINDDK\2600\build.dat... BUILD: Computing Include file dependencies: BUILD: Examining c:\dev-cpp\myfirstdriver directory for files to compile. c:\dev-cpp\myfirstdriver - 2 source files (156 lines) BUILD: Saving C:\WINDDK\2600\build.dat... BUILD: Compiling c:\dev-cpp\myfirstdriver directory 1>Compiling - mydrivermessages.rc for i386 1>Compiling - mydriver.c for i386 BUILD: Linking c:\dev-cpp\myfirstdriver directory 1>Linking Executable - objfre\i386\mydriver.sys for i386 BUILD: Done
3 files compiled - 78 LPS 1 executable built PS Тока, почему у нас с вами результаты различаются немного?
|
|
« Последнее редактирование: 31-10-2011 14:25 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #14 : 31-10-2011 15:04 » |
|
C:\temp\MyFirstDriver>build BUILD: Adding /Y to COPYCMD so xcopy ops won't hang. BUILD: Using 2 child processes BUILD: Object root set to: ==> objfre_wxp_x86 BUILD: Compile and Link for i386 BUILD: Loading C:\DDK\3790~1.183\build.dat... BUILD: Computing Include file dependencies: BUILD: Examining c:\temp\myfirstdriver directory for files to compile. c:\temp\myfirstdriver - 2 source files (156 lines) BUILD: Saving C:\DDK\3790~1.183\build.dat... BUILD: Compiling (NoSync) c:\temp\myfirstdriver directory 1>Compiling - mydrivermessages.rc for i386 1>Compiling - mydriver.c for i386 BUILD: Compiling c:\temp\myfirstdriver directory BUILD: Linking c:\temp\myfirstdriver directory 1>Linking Executable - objfre_wxp_x86\i386\mydriver.sys for i386 BUILD: Done
3 files compiled 1 executable built DDK другой версии, и версию я для cheked делал
|
|
« Последнее редактирование: 31-10-2011 15:06 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #15 : 31-10-2011 15:28 » |
|
Понятно, спасибо. А как использовать этот драйвер? Он должен выдавать сообщения при вызове какой-либо из функций I/O, Массива MajorFunction. PS Я его установил при помощи reg файла, в списке устройств он появился в скрытом разделе "Драйверы устройств не Plug and Play"
Добавлено через 1 день, 1 час, 47 минут и 40 секунд: Этот "драйвер" я списал с книги В. Комиссаровой, там написано, что в книге нет полного кода этого драйвера и еще, что книга располагает избыточной информацией для того, что бы дописать этот драйвер самостоятельно. Я по этой книге дальше учиться писать драйверы не собираюсь, так как там очень мало объясняется, и часто встречается фраза типа "здесь всё интуитивно понятно" или еще что-то подобное, и поэтому эту книгу не советуют использовать для изучения драйверостроения. На одном форуме её даже назвали вредной. Может быть кто-нибудь предполагает, что в этой книге не хватает для того, что бы он начал выдавать сообщения?
|
|
« Последнее редактирование: 01-11-2011 20:57 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #16 : 02-11-2011 07:12 » |
|
для этого вам необходимо его как минимум загрузить... и поуправлять. управление у него DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateMyDriver; DriverObject->MajorFunction[IRP_MJ_READ] = ReadMyDriver; DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteMyDriver; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlMyDriver; устанавливать не обязательно. открыть - соответственно CreateFile() по его символической ссылке читать-писать -ReadFile|WriteFile управление DeviceIoControl но вместо обработки IRP там пустые заглушки. при вызове будет только вывод сообщений в системный лог. почитайте msdn на эти IRP и попробуйте посмотреть примеры DDK) вывод сообщений, теоретически, должен происходить здесь (это в администрировании) PS и помоему тут IRP_MJ_CLOSE явно не хватает... не знаю как он без него будет... PPS но даже при загрузке через reg-файл в системном логе одно сообщение у вас появится.
|
|
« Последнее редактирование: 02-11-2011 07:22 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #17 : 02-11-2011 07:36 » |
|
Спасибо за информацию, попробую что нибудь сделать, но ничего не обещаю.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #18 : 02-11-2011 09:24 » |
|
ну это уж вам решать
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #19 : 10-12-2011 04:40 » |
|
После некоторой вынужденной паузы решил вернуться к курсовой работе, уже честно говоря пожалел, что выбрал данную тему для курсача. Попытался воспользоваться функцией CreateFile(), она включена в заголовочный файл Windows.h и объявлена в файле Winbase.h, пишу сюда собственно, потому-что у меня ничего не получилось. Сначала выдавало, что не может найти файлы заголовочные, которые объявлены в Windows.h я их всех закинул в каталог с проектом и поменял <file.h> на "file.h", пеперь выдаёт 150 ошибок синтаксиса и другого рода ошибок в файле WinBase.h. Без вашей помощи я не справлюсь. Нужно открыть файл который я с вашей помощью скомпилировал, но ничего не получается. Подскажите пожалуйста
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #20 : 10-12-2011 05:42 » |
|
Fredwriter, Зачем перекидовал? Теперь скорее всего у тебя потянутся зависимости, которые ты сам не сможеш разгребсти. Для начало нужно вдумчмво читать лог ошибок. И разгребать по одной сверху вниз (Иногда одна ошибка тянет за собой рой ошибок). Теперь, На какой стадии компилятор жаловался, что не может найти файлы, на стадии компиляции или на стадии линковки?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #21 : 10-12-2011 07:08 » |
|
Fredwriter, стоп, ты что CreateFile() в драйвер запихивал?
|
|
|
Записан
|
|
|
|
Fredwriter
|
|
« Ответ #22 : 10-12-2011 08:46 » |
|
zubr, нет конечно, просто пытался в другом проекте с помощью CreateFile() открыть файл MyDriver.sys. Finch, я уже скомпилировал драйвер, осталось только открыть его. Не знаю зачем я это сказал, не подумал. Жаловался на стадии компиляции.
|
|
« Последнее редактирование: 10-12-2011 08:55 от Fredwriter »
|
Записан
|
Ищущий да обрящет
|
|
|
Ochkarik
|
|
« Ответ #23 : 10-12-2011 10:41 » |
|
Fredwriter, то есть проблема не в драйвере а в том что не можете скомпилировать приложение которое его откроет, я правильно понимаю?
показывайте код... показывайте настройки. показывайте переменные окружения. пишите по шагам что делали. чем пользуетесь? студией, Build-ом? либо выкладывайте все сюда... но без тех заголовочных файлов windows которые вы туда напихали) и покажите лог компиляции.
PS сейчас убегаю, смогу посмотреть либо вечером, в крайнем случае в понедельник с работы. но если не касается драйвера - то это и в API-windows ветке вам подскажут;)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|
Ochkarik
|
|
« Ответ #25 : 11-12-2011 11:15 » |
|
В том то и дело, что я только лишь записал в проекте код вызова функции CreateFile()
в каком проекте? описание функции до конца прочитали? Используемая библиотека Kernel32.lib
Используемая DLL - нет Заголовочный файл - объявлено в Winbase.h - включено в Windows.h
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #26 : 12-12-2011 03:09 » |
|
в каком проекте? Какая разница в каком проекте? Просто это было единственное, что содержала процедура tmain {}. Не знаю правильно или нет я воспользовался функцией CreateFile() Опыт программирования в Visual С++ у меня менее чем скромный. Вот код, который я написал. #include "stdafx.h" #include "windows.h" #include "windef.h"
int _tmain(int argc, _TCHAR* argv[]) { CreateFile("Имя файла", FILE_ADD_FILE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); }
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #27 : 12-12-2011 08:39 » |
|
Ochkarik, скорее всего проблема в среде разработки или используемом инструментарии. Я, к сожалению, не знаю сред, используемых драйверописателями, но видимо автор темы собирает свой код не в том окружении, которое нужно. Если это проект Visual Studio, то следует посмотреть subsystem у линкера.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Ochkarik
|
|
« Ответ #28 : 12-12-2011 09:09 » |
|
Dimka, само собой... последнее - это обычное приложение, НЕ драйвер. так что со средами все почти стандартно. есть специфическая утилита от мйкрософта build которая вызывает компилятор и линкер с настройками через большой предопределенный make-файл, но ее для приложений редко используют.
Fredwriter, разница есть) кроме кода, существуют еще настройки компилятора и линкера - проблема в них. либо VS криво встала, что менее вероятно. еще раз говорю - весь проект приложения выложите! либо весь лог ошибок.
PS CreateFile правильно. только символическая ссылка на драйвер будет типа (L"\\.\\MyDriver") либо ("\\.\\MyDriver") в зависимости от использования unicode/multibyte charster set в проекте.
|
|
« Последнее редактирование: 12-12-2011 09:12 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Fredwriter
|
|
« Ответ #29 : 12-12-2011 10:07 » |
|
Хорошо, выкладываю проект.
|
|
|
Записан
|
Ищущий да обрящет
|
|
|
|