Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3 4  Все   Вниз
  Печать  
Автор Тема: Не должно быть здесь этой ошибки! :confused:  (Прочитано 86526 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« : 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 27-10-2011 20:54 » 

с ходу вроде проблем в коде не видно. настройки компилятора какие? _stdcall? x64 случайно?
MajorFunction[] - какой тип имеет? видимо PDRIVER_DISPATCH. как он определен? а то дома посмотреть негда)


Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 28-10-2011 02:15 » 

с ходу вроде проблем в коде не видно. настройки компилятора какие? _stdcall? x64 случайно?
MajorFunction[] - какой тип имеет? видимо PDRIVER_DISPATCH. как он определен? а то дома посмотреть негда)
Ochkarik, насчет компилятора не знаю (как узнать можно и как настроить то что нужно?), а MajorFunction это одно из полей структуры PDRIVER_OBJECT - массив PDRIVER_DISPATCH, который содержит таблицу указателей на функции ввода вывода драйвера, она у меня заполняется именно там где ошибка. Вот не пойму откуда ж ошибка то?
Записан

Ищущий да обрящет
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 28-10-2011 08:58 » 

сходите по ссылкам отсюда: https://forum.shelek.ru/index.php/topic,14406.0.html
нам указаны все опции. видимо ошибка в них.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 30-10-2011 20:26 » 

выкладывайте все в архиве. либо проект VS либо для Build либо и то и то.
завтра на работе если будет время - гляну.

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 31-10-2011 00:32 » 

С переменной окружения разобрался, нужно было (если кому пригодится) Мой компьютер->свойства->дополнительно->Переменные среды->системные.
После этого я обнаружил, что версия компилятора Visual C++ 6.0 Professional Edition, который я скачал не поддерживает DDK, мне компилятор так и сказал.
Буду опять устанавливать VS2008.

* MyFirstDriver.rar (2.84 Кб - загружено 857 раз.)
Записан

Ищущий да обрящет
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 02-11-2011 07:36 » 

Спасибо за информацию, попробую что нибудь сделать, но ничего не обещаю. Улыбаюсь
Записан

Ищущий да обрящет
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 02-11-2011 09:24 » 

ну это уж вам решать Ага
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 10-12-2011 04:40 » 

После некоторой вынужденной паузы решил вернуться к курсовой работе, уже честно говоря пожалел, что выбрал данную тему для курсача. Попытался воспользоваться функцией CreateFile(), она включена в заголовочный файл Windows.h и объявлена в файле Winbase.h, пишу сюда собственно, потому-что у меня ничего не получилось. Сначала выдавало, что не может найти файлы заголовочные, которые объявлены в Windows.h я их всех закинул в каталог с проектом и поменял <file.h> на "file.h", пеперь выдаёт 150 ошибок синтаксиса и другого рода ошибок в файле WinBase.h. Без вашей помощи я не справлюсь. Нужно открыть файл который я с вашей помощью скомпилировал, но ничего не получается. Подскажите пожалуйста
Записан

Ищущий да обрящет
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #20 : 10-12-2011 05:42 » 

Fredwriter, Зачем перекидовал? Теперь скорее всего у тебя потянутся зависимости, которые ты сам не сможеш разгребсти. Для начало нужно вдумчмво читать лог ошибок. И разгребать по одной сверху вниз (Иногда одна ошибка тянет за собой рой ошибок). Теперь, На какой стадии компилятор жаловался, что не может найти файлы, на стадии компиляции или на стадии линковки?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Гость
« Ответ #21 : 10-12-2011 07:08 » 

Fredwriter, стоп, ты что CreateFile() в драйвер запихивал?
Записан
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 10-12-2011 08:46 » 

zubr, нет конечно, просто пытался в другом проекте с помощью CreateFile() открыть файл MyDriver.sys.
Finch, я уже скомпилировал драйвер, осталось только открыть его. Не знаю зачем я это сказал, не подумал. Жаловался на стадии компиляции.
« Последнее редактирование: 10-12-2011 08:55 от Fredwriter » Записан

Ищущий да обрящет
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 10-12-2011 10:41 » 

Fredwriter, то есть проблема не в драйвере а в том что не можете скомпилировать приложение которое его откроет, я правильно понимаю?

показывайте код... показывайте настройки. показывайте переменные окружения. пишите по шагам что делали.
чем пользуетесь? студией, Build-ом?
либо выкладывайте все сюда... но без тех заголовочных файлов windows которые вы туда напихали)
и покажите лог компиляции.

PS сейчас убегаю, смогу посмотреть либо вечером, в крайнем случае в понедельник с работы.  но если не касается драйвера - то это и в API-windows ветке вам подскажут;)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 11-12-2011 01:50 » 

В том то и дело, что я только лишь записал в проекте код вызова функции CreateFile() описание взял здесь http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_createfile.htm.
Выложу также файл драйвера:

* MYDRIVER.sys (2.5 Кб - загружено 799 раз.)
Записан

Ищущий да обрящет
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 11-12-2011 11:15 » 

В том то и дело, что я только лишь записал в проекте код вызова функции CreateFile()
в каком проекте?
описание функции до конца прочитали?
Цитата
Используемая библиотека Kernel32.lib

Используемая DLL   - нет
 Заголовочный файл    - объявлено в Winbase.h
                                 - включено в   Windows.h
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 12-12-2011 08:39 » 

Ochkarik, скорее всего проблема в среде разработки или используемом инструментарии. Я, к сожалению, не знаю сред, используемых драйверописателями, но видимо автор темы собирает свой код не в том окружении, которое нужно. Если это проект Visual Studio, то следует посмотреть subsystem у линкера.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Fredwriter
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 12-12-2011 10:07 » 

Хорошо, выкладываю проект.

* UseDriver.rar (306.35 Кб - загружено 830 раз.)
Записан

Ищущий да обрящет
Страниц: [1] 2 3 4  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines