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

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

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

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

« Ответ #30 : 12-12-2011 10:36 » 

уберите  строчку  #include "windef.h"
и измените путь к файлу на L"\\\\.\\MyDriver"
или какое там имя было...

PS   так наверное правильней будет
  hDrv = CreateFile ( L"\\\\.\\MyDriver", GENERIC_READ | GENERIC_WRITE,
                  0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
« Последнее редактирование: 12-12-2011 15:51 от Ochkarik » Записан

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

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

« Ответ #31 : 12-12-2011 12:51 » 

Выкладываю код и соответствующий ему лог ошибок, после выполнения всех написанных Вами, Ochkarik действий.

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

Ищущий да обрящет
Dimka
Деятель
Команда клуба

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

« Ответ #32 : 12-12-2011 13:50 » 

Код:
1>------ Rebuild All started: Project: UseDriver, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'UseDriver', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>UseDriver.cpp
1>c:\users\user\documents\visual studio 2005\projects\usedriver\usedriver\usedriver.cpp(11) : error C2065: 'GENRIC_READ' : undeclared identifier
1>c:\users\user.\documents\visual studio 2005\projects\usedriver\usedriver\usedriver.cpp(12) : error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [13]' to 'LPCWSTR'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Обращаю внимание, что здесь я делал Rebuild, а не Build - PCB-файл моя версия Visual Studio признала повреждённым и несоответствующим.

Любопытно также, что в проекте зачем-то Unicode включен. Тогда надо L"\\\\.\\MyDriver" или что там у вас. Ну и конечно опечатка в GENERIC_READ. Если это поправить, то вуаля.

Код:
1>------ Build started: Project: UseDriver, Configuration: Debug Win32 ------
1>Compiling...
1>UseDriver.cpp
1>Compiling manifest to resources...
1>Linking...
1>Embedding manifest...
1>Build log was saved at "file://c:\Users\user\Documents\Visual Studio 2005\Projects\UseDriver\UseDriver\Debug\BuildLog.htm"
1>UseDriver - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Из чего можно заключить, что либо кто-то особо умелый сносил и устанавливал Windows SDK при живой Visual Studio, либо чьи-то золотые руки мастерски ковырялись в настройках самой Visual Studio, либо происходило что-нибудь в этом духе.

В меню Tools/Options... В диалоге в дереве Projects and Solutions/VC++ Directories. Затем справа сверху Show directories for поставить в значение Include Files. Полученный список в студию (можно скриншотом, если там нет прокрутки).

По-умолчанию это выглядит так:

* vcppdir.png (20.45 Кб - загружено 2697 раз.)
« Последнее редактирование: 12-12-2011 14:01 от Dimka » Записан

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

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

« Ответ #33 : 12-12-2011 14:50 » 

Переустановил Visual C++, поменял 2005 на 2008, теперь у меня такой лог:
Код:
Compiling...
cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release
stdafx.cpp
Compiling...
cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release
UseDriver.cpp
c:\program files\microsoft sdks\windows\v6.0a\include\windows.h(21) : fatal error C1083: Cannot open include file: 'sdkddkver.h': No such file or directory
при таких настройках:

* Настройки.bmp (707.15 Кб - загружено 2951 раз.)
Записан

Ищущий да обрящет
Dimka
Деятель
Команда клуба

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

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

Fredwriter, посмотри в папке c:\program files\microsoft sdks\windows\v6.0a\include\ есть ли там файл sdkddkver.h.

У меня есть, и сборка проходит нормально с учётом конвертирования под VS 2008 и исправления мною вышеописанных ошибок.

Пути такие же. А вот в PlatformSDK, включённый в состав Visual C++, такого файла нет.
« Последнее редактирование: 12-12-2011 15:28 от Dimka » Записан

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

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

« Ответ #35 : 12-12-2011 16:06 » 

PS да... после того как вы скомпилите приложение перед его запуском, драйвер еще установить надо будет... при помощи SC-менеджера.
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая: там объект устройства и ссылка не убивается. то есть в том состоянии как он выложен ранее - он не выгрузится и второй раз не загрузится.
и кстати флаги deviceObject->Flags  лучше ставить после инициализации DriverObject->MajorFunction[] и остального, хотя это не повлияет в вашем случае.
еще рекомендую, поставить какую нибудь программу вывода отладочных сообщений ядра например DebugMon от SysInternals. и натыкать сообщений DbgPrint() чтобы смотреть, что у вас происходит.

PPS Dimka, у меня SDK кажись не стоит. но все компилится тоже.
« Последнее редактирование: 12-12-2011 16:08 от Ochkarik » Записан

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

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

« Ответ #36 : 12-12-2011 16:56 » 

Переустановил SDK, и всё заработало, спасибо огромное за помощь, теперь можно продолжить.
Записан

Ищущий да обрящет
Dimka
Деятель
Команда клуба

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

« Ответ #37 : 12-12-2011 17:24 » 

Цитата: Ochkarik
PPS Dimka, у меня SDK кажись не стоит. но все компилится тоже.
SDK в той или иной форме всегда присутствует, иначе просто невозможно собрать приложение для Windows. В нём все заголовочные файлы Windows и lib-библиотеки для взаимодействия приложения с системными dll.
Записан

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

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

« Ответ #38 : 12-12-2011 20:01 » 

Dimka, ну это само собой... я имел в виду, что отдельно не ставил. не знал что можно добиться такого эффекта.
а ссылка на папки SDK после удаления последней где могут остаться?
в настройках путей студии, и в переменных окружения?
я думал, что уж они то за собой чистят... по крайней мере те, что написанные майкрософтом...
« Последнее редактирование: 12-12-2011 20:15 от Ochkarik » Записан

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

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

« Ответ #39 : 13-12-2011 06:32 » 

Цитата
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая:
А что не так с DriverUnload? Чего там не хватает?
Записан

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

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

« Ответ #40 : 13-12-2011 08:03 » 

Цитата
а еще перед этим - доправить его, потому что у него процедура выгрузки не рабочая:
А что не так с DriverUnload? Чего там не хватает?
Цитата
там объект устройства и ссылка не убивается
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Dimka
Деятель
Команда клуба

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

« Ответ #41 : 13-12-2011 08:54 » 

Цитата: Ochkarik
а ссылка на папки SDK после удаления последней где могут остаться?
Да где угодно. Не одна ж VS на него может ссылаться. И другие компиляторы, и среды разработки. И отдельно устанавливаемые библиотеки для разработчиков.
Записан

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

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

« Ответ #42 : 13-12-2011 09:56 » 

Цитата
там объект устройства и ссылка не убивается
А как её убить заразу?
Вот код моей функции DriverUnload:
Код:
VOID MyDriverUnload (IN PDRIVER_OBJECT DriverObject)
{
     UNICODE_STRING linkString;
     GetMessage(MSG_DRIVERUNLOAD, DriverObject, NULL);
     RtlInitUnicodeString(&linkString, L"\\DosDDevices\\MyDriver");
     IoDeleteSymbolicLink(&linkString);
     IoDeleteDevice(DriverObject->DeviceObject);
}
Вот код функции DriverUnload, которую использует Уолтер Они в Своей книге Использование WDM:
Код:
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{ // DriverUnload
PAGED_CODE();
KdPrint((DRIVERNAME " - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject));
RtlFreeUnicodeString(&servkey);
} // DriverUnload
Может не в функции DriverUnload нужно заниматься этим мокрым делом?
Записан

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

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

« Ответ #43 : 13-12-2011 10:13 » 

ааа... если так, то уже нормально.

только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет?

PS у Они такой код, потому что там небось драйвер PnP. в них - устройство рождается в AddDevice() по обнаружению экземпляра оборудования, а удаляется в IRP_MJ_PNP....
у вас legacy-драйвер, устройство вы рождаете в DriverEntry. удалить должны сами... когда нибудь, когда сочтете нужным)

ЗЗЫ только не
Цитата
DosDDevices

PPPS и статусы... статусы все всех функций проверяем! сколько говорить то уже можно!
« Последнее редактирование: 13-12-2011 10:16 от Ochkarik » Записан

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

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

« Ответ #44 : 13-12-2011 10:31 » 

Цитата
только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет?

Вот, значит, часть кода, где создаётся объект устройства, это то, что нужно?
Код:
RtlInitUnicodeString(&nameString, L"\\Device\\MyDriver");
        
         status = IoCreateDevice(DriverObject, sizeof(65533), &nameString,
                                 0, 0, FALSE, &deviceObject);
         if (!NT_SUCCESS(status))
           return status;
Записан

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

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

« Ответ #45 : 13-12-2011 11:36 » 

вот это "sizeof(65533)" - что это, и зачем?
да, эта строка создает объект и возвращает указатель на созданный объект в deviceObject.
и...?
Записан

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

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

« Ответ #46 : 13-12-2011 12:33 » 

Цитата
вот это "sizeof(65533)" - что это, и зачем?
Это так в книге было, по которой я этот драйвер писал. Почитал Уолтера Они, он указывает в этом параметре размер структуры DEVICE_EXTENSION. DEVICE_EXTENSION - это структура, указатель на которую хранится в поле DeviceExtention структуры DEVICE_OBJECT. Эта структура (DEVICE_EXTENSION) определяется автором драйвера и хранит информацию о конкретном экземпляре устройства. То есть, это структура расширения устройства. По всей видимости из-за того, что DeviceExtension не определено, в книге и не указывают её размер. Sizeof ведь возвращает размер занимаемый  (в байтах) переменной или типа, ну, по всей видимости и константы тоже.
Цитата
и...?
А вот это я не понял вопроса.
« Последнее редактирование: 13-12-2011 12:36 от Fredwriter » Записан

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

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

« Ответ #47 : 13-12-2011 13:03 » 

это я вашего вопроса не понял) в чем вопрос то был?
Записан

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

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

« Ответ #48 : 13-12-2011 13:08 » 

Вы, спросили:
Цитата
только вот DriverObject->DeviceObject.... не уверен, будет там верный указатель или нет. кто его заполняет?
Я выложил часть кода, где создаётся объект устройства, и спросил то или не то?
Записан

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

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

« Ответ #49 : 13-12-2011 13:22 » 

все. но более полный ответ был бы
DRIVER_OBJECT
Цитата
PDEVICE_OBJECT DeviceObject
Pointer to the device objects created by the driver. This member is automatically updated when the driver calls IoCreateDevice successfully. A driver can use this member and the NextDevice member of DEVICE_OBJECT to step through a list of all the device objects that the driver created.
...
могли бы и сами проверить.
Записан

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

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

« Ответ #50 : 13-12-2011 13:38 » 

Цитата
после того как вы скомпилите приложение перед его запуском, драйвер еще установить надо будет... при помощи SC-менеджера.
Я уже установил его, но не при помощи SC-менеджера, а при помощи Reg-файла вот таким путём:
Код:
REGEDIT4
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MyDriver]
"ErrorControl"=dword:00000001
"Type"=dword:00000001
"Start"=dword:00000002
"ImagePath"="\\SystemRoot\\System32\\Drivers\MyDriver.sys
Тоже из той книги. Теперь уж можно писать программку, которая будет открывать драйвер и делать с ним всякие вещи?
Записан

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

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

« Ответ #51 : 13-12-2011 13:40 » 

можно)
Записан

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

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

« Ответ #52 : 14-12-2011 08:02 » 

Подскажите пожалуйста, как правильнее написать программку, которая будет использовать устройство, что там должно быть и как грамотнее это расположить.
Понятно, что там должны быть такие Api, как CreateFile ReadFile, WriteFile, DeviceIoControl
Я здесь нашел их описания и примеры использования:
http://vsokovikov.narod.ru/New_MSDN_API/Device_io/calling_deviceiocontrol.htm
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_writefile.htm
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm
http://vsokovikov.narod.ru/New_MSDN_API/device_io.htm

Записан

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

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

« Ответ #53 : 14-12-2011 08:07 » 

ссылки - все не то.
определитесь сначала, что вы хотите получить. в зависимости от этого и пишутся все программы)
Записан

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

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

« Ответ #54 : 14-12-2011 10:00 » 

Я хочу, одну, как кажется простую вещь, нужно, что-бы при использовании какой-нибудь MajorFunction, имеющейся в драйвере, выводилось на экран сообщение. То есть при какой-то операции ввода вывода -  как-бы демонстрация возможной функциональности драйвера. Драйвер который объясняет как он ведет себя при определенном I/O запросе. Там только 4 MajorFunction, и еще есть функция GetMessage. Вот она и отвечает за вывод сообщений при каком-нибудь I/O запросе. Вот собственно что мне нужно. GetMessage кажется немного переделать нужно, и написать программку, которая будет дергать драйвер.
Цитата
Определитесь сначала, что вы хотите получить. В зависимости от этого и пишутся все программы)

Я знаю в зависимости от чего пишутся программы, просто я думал, что не только я знаю, что я хочу получить.
« Последнее редактирование: 14-12-2011 10:40 от Fredwriter » Записан

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

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

« Ответ #55 : 14-12-2011 10:58 » 

по сути - да, все верно. так и надо сделать!
Записан

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

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

« Ответ #56 : 14-12-2011 12:10 » 

Я вот и прошу совета, как лучше это сделать? Что и как написать? Можете меня проинструктировать?
Записан

Ищущий да обрящет
Fredwriter
Постоялец

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

« Ответ #57 : 14-12-2011 14:39 » 

что я вкладываю в слово "проинструктировать": с программистской точки зрения как-нибудь мне объяснить, что-бы я таки написал данную прогу и защитил 20-го числа курсовой.
Записан

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

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

« Ответ #58 : 14-12-2011 14:58 » 

для начала вам надо убедится что драйвер загружается и корректно выполняет то что он уже должен выполнять.
если вы понимаете что вы уже написали - у вас это получится.

далее, для начала вам надо заполнить в драйвере свои обработчики MJ_CREATE/MJ_CLOSE которые отвечают за обработку вызовов CreateFIle/CloseHandle из приложения,
и например MJ_READ/MJ_WRITE которые отвечают за вызов ReadFile/WriteFile из приложения.
далее вставить в них, то что вам надо. пусть это будет тот же мессадж. или отладочное сообщение.
далее из написанного приложения - открыть драйвер по символической ссылке и чего нибудь в него записать и закрыть, отслеживая дейсвия по мессаджам в журнале(или отладочным сообщениям в DbgView)

как-то так)
Записан

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

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

« Ответ #59 : 14-12-2011 17:51 » 

Цитата
для начала вам надо убедится что драйвер загружается и корректно выполняет то что он уже должен выполнять. Если вы понимаете что вы уже написали - у вас это получится.
Дело в том, что я писал этот драйвер по одной книге, а объяснение всего, что там написано читал в другой. Я прекрасно понимаю, что там написано, но кроме того, что там написано я больше ничего никогда не писал на Си. Поэтому я не могу понять как убедиться в том, что он корректно загружается - я этого никогда не делал. В функции DriverEntry моего драйвера имеется то, что должно быть в стандартной подобной функции: создание объекта устройства, создание символической ссылки, и заполнение массива MajorFuntion[]. А сами MajorFunction[], почти все ничего и не выполняют, кроме вызова функции GetMessage, которая заполняет структуру IO_ERROR_LOG_PACKET и выводит её в системный лог. Как проверить корректно он работает или нет я не знаю а что он написано понимаю, такое тоже бывает).
Только вот что я понять не могу, там написано:
Код:
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;
        }
А в функциях драйвера везде NULL подаётся, то есть никаких Irp в IO_ERROR_LOG_PACKET никогда не будет?
« Последнее редактирование: 14-12-2011 18:03 от Fredwriter » Записан

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

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

« Ответ #60 : 14-12-2011 18:10 » 

Панель управления-Администрирование-Просмотр событий
кажется в системных событиях должно все появляться, если не ошибаюсь. почитайте описание функций которые вы используются в GetMessage и про IO_ERROP_LOG_PACKET на MSDN.
язык программирования роли не играет.

насчет остальных MJ_ функций  - там так же все просто. поищите пример использования - их есть много в сети.

PS понимаете, писать за вас код, ну совсем желания нет) но если будете задавать ПРАВИЛЬНЫЕ вопросы, могу пнуть в нужном направлении.
PPS не только правильные вопросы, но и хотя бы ваши попытки в них разобраться самостоятельно.
« Последнее редактирование: 14-12-2011 18:14 от Ochkarik » Записан

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

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

« Ответ #61 : 14-12-2011 19:57 » 

Про IoWriteErrorLogEntry на MSDN как-то непонятно написано, а в других местах она описывается как функция, которая выводит в log entry сообщение, то есть тот пакет, который ей передали в параметре.
Цитата
Панель управления-Администрирование-Просмотр событий
Я знаю где находится log entry, вы мне это уже говорили в одном из предыдущих постов.
На msdn про поле MajorFunctionCode говорится, что этот параметр не является обязательным, а обязателен как я понял параметр ErrorCode, он то и говорит Event Viewer'у тип ошибки, и Event Viewer понимает какие строки нужно вывести.
Цитата
насчет остальных MJ_ функций  - там так же все просто. поищите пример использования - их есть много в сети.
Что значит пример использования - это и есть часть моей программы, которая будет использовать драйвер?
Я просто не могу понять, что мне искать. Так, бы я, может, уже и нашел кабы знал).
Цитата
для начала вам надо заполнить в драйвере свои обработчики MJ_CREATE/MJ_CLOSE которые отвечают за обработку вызовов CreateFIle/CloseHandle из приложения,
MJ_CREATE, MJ_READ и MJ_WRITE у меня есть, что значит заполнить, у меня там вызывается функция GetMessage и всё... ну MJ_CREATE у меня еще IoCompleteRequest
в msdn написано так:
Когда драйвер закончил всю обработку для данного IRP, он вызывает IoCompleteRequest.
Записан

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

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

« Ответ #62 : 14-12-2011 20:20 » 

https://club.shelek.ru/viewart.php?id=76
для ознакомления. и взаимодействие с драйвером через API DeviceIOControl

http://drp.su/ru/driver_dev/03_01-8.htm
тут есть по открытию- чтению-записи. наврал... заглушки функций.

+выделить из прочитанного ключевые слова и искать дальше по их комбинациям, пользуясь гуглом.

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

ключевые слова для поиска -
драйвер
Windows
а так же названия дефенишенов(кодов функций), самих функций, структур и т.д.

и по-моему вы до сих пор не понимаете что вы хотите получить на выходе. либо я этого не чувствую. потому что до сих пор точной постановки задачи не услышал. попробуйте себе алгоритм составить. что вы хотите/должны "нажать" и что должно произойти в результате.

Добавлено через 4 минуты и 8 секунд:
http://www.pcports.ru/articles/ddk1.php
http://www.pcports.ru/articles/ddk2.php
http://www.pcports.ru/articles/ddk3.php
http://www.pcports.ru/articles/ddk4.php
http://www.pcports.ru/articles/ddk5.php


и вообще
http://www.google.ru/search?hl=ru&q=%D0%BF%D0%B8%D1%88%D0%B5%D0%BC+%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9+%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=

Добавлено через 9 минут и 38 секунд:
http://blagin.ru/sozdanie-drajverov-chast-4-obmen-dannymi/
« Последнее редактирование: 14-12-2011 20:35 от Ochkarik » Записан

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

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

« Ответ #63 : 14-12-2011 21:43 » 

Вот за это - https://club.shelek.ru/viewart.php?id=76 огромное спасибо, а вот здесь http://drp.su/ru/driver_dev/03_01-8.htm не пример программы, а пример драйвера.
Записан

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

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

« Ответ #64 : 15-12-2011 10:28 » 

самую последнюю ссылку смотрите. там все есть.
Записан

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

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

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

Пытаюсь собрать это приложение из кусочков программ со ссылок, которые вы мне дали, но из-за моей неопытности в Visual C++ не могу исправить все ошибки, которые почему-то там возникают, может кто-нибудь посмотрит?
Там было 50 ошибок сейчас 40.
Еще 17 ошибок исправил, файл перезалил.
там сейчас 50 ошибок, так как одну исправил (нужно было скобочку доставить)) и из-за этого еще 16 добавилось.
Где взять файл error.h из-за него всё.
PS
  Я наше про error_index здесьhttp://cctbx.sourceforge.net/current_cvs/c_plus_plus/classDistl_1_1scitbx_1_1error__index.html, там сверху один хидер - <scanbox.h> а снизу error.h
не пойму, где он взял этот error_index. Его я даже на MSDN не могу найти.

* UseDriver.rar (770.35 Кб - загружено 818 раз.)
« Последнее редактирование: 16-12-2011 09:58 от Fredwriter » Записан

Ищущий да обрящет
Fredwriter
Постоялец

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

« Ответ #66 : 16-12-2011 10:51 » 

Осталась одна ошибка я убрал функцию Error, и испавил свои мелкие ошибки, заливаю обновлённый

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

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

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

« Ответ #67 : 16-12-2011 11:28 » 

если речь про
1>c:\temp\usedriver\usedriver\usedriver.cpp(163) : error C2664: 'ControlService' : cannot convert parameter 3 from 'LPSERVICE_STATUS *' to 'LPSERVICE_STATUS'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

то это потому что третий, переданный параметр в функцию - не соответствует типу который  понимает функция.
функции нужен указатель, а вы двойной указатель передаете.
надо
 SERVICE_STATUS  ServiceStatus
Записан

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

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

« Ответ #68 : 16-12-2011 12:08 » 

исправил эту ошибку, появилось еще 8

Код:
Linking...
UseDriver.obj : error LNK2019: unresolved external symbol __imp__OpenSCManagerA@12 referenced in function "bool __cdecl OpenManager(void)" (?OpenManager@@YA_NXZ)
UseDriver.obj : error LNK2019: unresolved external symbol __imp__CloseServiceHandle@4 referenced in function "bool __cdecl OpenManager(void)" (?OpenManager@@YA_NXZ)
UseDriver.obj : error LNK2019: unresolved external symbol __imp__CreateServiceA@52 referenced in function "bool __cdecl drvCreateService(char *)" (?drvCreateService@@YA_NPAD@Z)
UseDriver.obj : error LNK2019: unresolved external symbol __imp__OpenServiceA@12 referenced in function "bool __cdecl drvOpenService(char *)" (?drvOpenService@@YA_NPAD@Z)
UseDriver.obj : error LNK2019: unresolved external symbol __imp__StartServiceA@12 referenced in function "bool __cdecl drvStartService(char *)" (?drvStartService@@YA_NPAD@Z)
UseDriver.obj : error LNK2019: unresolved external symbol __imp__DeleteService@4 referenced in function "bool __cdecl drvDeleteService(char *)" (?drvDeleteService@@YA_NPAD@Z)
UseDriver.obj : error LNK2019: unresolved external symbol __imp__ControlService@12 referenced in function "int __cdecl drvUnLoad(char *)" (?drvUnLoad@@YAHPAD@Z)
D:\Мои документы\Задания\ПО УЧЕБЕ\Операционные системы\UseDriver\Debug\UseDriver.exe : fatal error LNK1120: 7 unresolved externals
Вот проект

Всё, отмена, исправлено
Для тех, кто столкнётся с подобной ошибкой:
Project->Project Properties->Configuration Properties->Linker->Input->Additional Dependencies - поставил галку на Inherit from parent or project default

* UseDriver.rar (741.9 Кб - загружено 808 раз.)
« Последнее редактирование: 16-12-2011 13:29 от Fredwriter » Записан

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

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

« Ответ #69 : 16-12-2011 13:29 » 

error LNK2019: unresolved external symbol
+
OpenSCManager
CloseServiceHandle
и т.д.

PS Requirements

« Последнее редактирование: 16-12-2011 13:34 от Ochkarik » Записан

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

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

« Ответ #70 : 16-12-2011 14:01 » 

Ошибку я уже исправил, программа запускается без ошибок, открываю просмотр событий, там при каждом запуске программы одна и та же ошибка картинку выкладываю.

Цитата
Не понял это к чему?

* Системный лог.bmp (920.1 Кб - загружено 2984 раз.)
« Последнее редактирование: 16-12-2011 14:04 от Ochkarik » Записан

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

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

« Ответ #71 : 16-12-2011 14:13 » 

хм. ошибка однако - видимо что то не....
проверяйте все, ищите что не так сделали.

Цитата
Не понял это к чему?
к прочтению соответствующего раздела документации.
Записан

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

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

« Ответ #72 : 16-12-2011 14:19 » 

слушайте... а зачем вам программирование?  может ну его нафиг)
Записан

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

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

« Ответ #73 : 16-12-2011 16:58 » 

Нашел одну ошибку:
Код:
GetCurrentDirectory(256, lpBuffer);
   strcat(lpBuffer,"\");
   strcat(lpBuffer,pDrvName);
   awPath = lpBuffer;
Так как знак "\" является одной из скобок языка, не получается прибавить его строке lpBuffer, а код не я писал, я его только переписал. Это прошло компиляцию, потому-что я, по невнимательности, когда выдало ошибку в этой строке, просто написал так:
Код:
strcat(lpBuffer,"\"");

Цитата
слушайте... а зачем вам программирование?  может ну его нафиг)
Прежде чем писать кому-то такое на форуме я бы тысячу раз подумал.


Добавлено через 1 час, 23 минуты и 27 секунд:
Почему-то сервис не создается, после прохода строки CreateServise(), hService не присваивается значение.
Выложу, что у меня есть.

* UseDriver.rar (776.4 Кб - загружено 822 раз.)
« Последнее редактирование: 16-12-2011 18:24 от Fredwriter » Записан

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

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

« Ответ #74 : 16-12-2011 19:04 » 

я подумал... я еще раз ваш код посмотрел....
типа этого куска например:
Цитата
bool OpenManager()
{
   bool status;
   status=FALSE;
   
   if (hSCManager!=NULL)
   {
           CloseServiceHandle (hSCManager);
           hSCManager=NULL;
   }
   
   hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
   
   status=TRUE;

   return status;
}
и вы утверждаете что вы его по вашему выражению "переписали". переписывать можно тоже по разному.

а далее я вижу проверку...
Код:
 	if(OpenManager()) 
{
....
и что по вашему делает это условие? проверяет что значение TRUE действительно равно TRUE?
наверное это просто необходимое условие продолжения работы!

следующая проверка
Код:
if(drvCreateService(name))
{
....
аналогично.
продолжать?
Записан

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

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

« Ответ #75 : 16-12-2011 19:10 » 

а код
Код:
   if (hSCManager!=NULL)
   {
           CloseServiceHandle (hSCManager);
           hSCManager=NULL;
   }
что по вашему делает?
проверяет что хендел устройства (проинициализированный нулем в функции drvLoad() ) действительно не равен нулю?
Записан

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

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

« Ответ #76 : 16-12-2011 19:15 » 

функция
Код:
bool drvCreateService(PCHAR pDrvName)
{
   LPTSTR lpBuffer;
  lpBuffer = new char[256];
  bool status = FALSE;
  LPTSTR awPath;
  
   GetCurrentDirectory(256, lpBuffer);
   strcat(lpBuffer,"\\");
   strcat(lpBuffer, pDrvName);
   awPath = lpBuffer;

hService = CreateService(hSCManager, pDrvName, pDrvName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, awPath, NULL, NULL, NULL, NULL, NULL);

status = drvOpenService(pDrvName);
        

delete lpBuffer;
return status;
}
при том что drvOpenService() так же, всегда возвращает TRUE (как и все остальные написаннные по принципу функции OpenManager() ) что по вашему вернет? что то отличное от TRUE?
Записан

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

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

« Ответ #77 : 16-12-2011 19:25 » 

а ошибка, могла быть из за включения Unicod-a в свойствах проекта, о чем еще страницу назад Dimka любопытствовал.
если до этой строчки выполнение этого безобразия, вообще доходит...
а может из за того что текущий каталог при выполнении программы не соответствует месту где драйвер лежит(в случае если код запускается из под отладчика).
а может еще где опечатка...
но это гадание на кофейной гуще. а компилировать и проверять, а тем более исправить самому это безобразие у меня даже желания не возникает.
 Я зол!

пардон... накипело. Скромно так...
Записан

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

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

« Ответ #78 : 16-12-2011 19:41 » 

Я пошагово выполняю программу, клавишу F11, значит, нажимаю, то есть пошаговое выполнение с заходом в функцию, в функции OpenManager() так как hSCManager обычно таки NULL вызывается функция API hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS)
и отрабатывет нормально ну хорошо, можно добавить вот это
Код:
hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL)
printf("Netushki");
else
status=TRUE;
Обычно всё нормуль, то есть true.
Затем стрелочка, как любая послушная стрелочка дебагера заходит в функцию drvCreateService(PCHAR pDrvName)
и здесь то и подвох, не проходит создание сервиса почему-то.
Код:
hService = CreateService(hSCManager, pDrvName, pDrvName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, awPath, NULL, NULL, NULL, NULL, NULL);
if (hService == NULL)
  printf("Netushki");
else
  status = drvOpenService(pDrvName);
Всегда нетушки. В чём проблема?
PS
  a Unicode я давно уже отключил.
Записан

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

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

« Ответ #79 : 16-12-2011 19:45 » 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682450(v=vs.85).aspx
Цитата
CreateService function
......
Return value
If the function succeeds, the return value is a handle to the service.
If the function fails, the return value is NULL.  To get extended error information,call GetLastError.
The following error codes can be set by the service control manager. Other error codes can be set by the registry functions that are called by the service control manager.
список кодов по ссылке описания CreateService
GetLastError function
Записан

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

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

« Ответ #80 : 16-12-2011 20:53 » 

GetLastError() сказал: "Указанная служба уже существует". Я, в этот момент вспомнил, что я уже установил драйвер с помощью reg - файла, и удалил его из устройств. Перезагрузил комп, убедился, что нет этого драйвера в устройствах, затем опять GetLastError() выдал эту же ошибку. Не пойму.

Добавлено через 50 минут и 42 секунды:
Всё, заработало вроде, пошли уведомления в логе от MyDriver.sys
Выложу картинку и проект:


Добавлено через 2 часа, 53 минуты и 46 секунд:
Прогонял программу пошагово по F10 и после прохода каждой функции заглядывал в EventLog, так там появляется событие только после drvLoad, а после WriteFile ничего не появляется. Вот же ж ёж.
PS
  То есть, только после открытия и запуска службы.

* UseDriver.rar (775.95 Кб - загружено 777 раз.)
* Системный лог.bmp (811.08 Кб - загружено 2926 раз.)
« Последнее редактирование: 17-12-2011 00:42 от Fredwriter » Записан

Ищущий да обрящет
Fredwriter
Постоялец

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

« Ответ #81 : 17-12-2011 01:25 » 

Всё с событиями разобрался коды выводит правильно, только EventLog почему-то не находит описание, но оно было в MyDriverMessages.h при сборке. Выложу картинку похвастаться:

 

* Системный лог.bmp (764.8 Кб - загружено 2889 раз.)
* Системный лог_1.bmp (532.09 Кб - загружено 2883 раз.)
Записан

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

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

« Ответ #82 : 17-12-2011 11:52 » 

уже лучше)
внимательно почитайте
http://www.adp-gmbh.ch/win/misc/writing_devicedriver.html
а так же http://msdn.microsoft.com/en-us/library/windows/hardware/ff543017(v=VS.85).aspx
и сопуствующие разделы
« Последнее редактирование: 17-12-2011 11:56 от Ochkarik » Записан

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

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

« Ответ #83 : 17-12-2011 18:36 » 

С выводом описания сообщения так и не разобрался, но пока пытался разобраться, обнаружил еще куда более серьёзную проблему, у меня управляющая программа запускается только один раз, на следующий раз она вырубает компьютер! и он перезагружается. Дебагером бегал по коду и отслеживал после прохода каждой API функции вывод в лог, первый раз, после перезагрузки она выводит пять сообщений, одно от Service Control Menager, вложена картинка, и четыре от драйвера с кодами 1 - CreateService, 2 - OpenService, 3 - ReadFile, 4 - WriteFile. Второй раз выводит четыре сообщения, одно от Application Popup, какое-то пугающее - смотреть вложение, и три от драйвера с кодами 2, 3, 4. Буду смотреть Application Popup.

Одну картинку первую перевложил
Вложу еще проект, может кто-нибудь рискнёт на своём компе такое дебагером?  Не надо
Не могу почему-то выложить проект, размет моего архива 773 kb, выдаёт ошибку: Ваш файл слишком большой, максимальный размер вложения 2048 kb? Не понял

* Системный ло_2.bmp (533.85 Кб - загружено 2809 раз.)
* Системный лог_3.bmp (745.73 Кб - загружено 2858 раз.)
* Системный ло_1.bmp (535.62 Кб - загружено 2824 раз.)
« Последнее редактирование: 17-12-2011 18:58 от Fredwriter » Записан

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

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

« Ответ #84 : 17-12-2011 18:55 » 

это не программа виновата. это драйвер глючит похоже. его  отлаживайте.
из программы комп завалить - это маловероятно.
Записан

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

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

« Ответ #85 : 17-12-2011 20:43 » 

Я немного неправильно рассказал последовательность вывода сообщений у меня при первом запуске 6 сообщений, последнее это как раз от Application Popup, а при втором 3 и перезагрузка) Насчёт отладки драйвера это проблема никогда этого не делал, не расскажите каким отладчиком лучше пользоваться и как вы это сами делаете?
PS я думаю это связано с этим сообщением Application Popup.
« Последнее редактирование: 17-12-2011 20:46 от Fredwriter » Записан

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

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

« Ответ #86 : 17-12-2011 21:30 » 

отладчиком...  Syser или WinDBG.. мне первый больше нравится, хотя он иногда поглюкивает... вторым не пользовался, да и вообще привык без него обходится. но с ним наверное долго разбираться будете.
попробуйте сначала обойтись отладочными сообщениями - как их ловить писал выше. (DbgView + DbgPrint в драйвере)
вбейте в драйвер все возможные проверки всех невозможных ошибок как можно чаще,  и ловите отладочные сообщения.
BSOD вы конечно так не увидите, но тут скорее проблема в первом обращении к драйверу а не во втором.
что то вы забыли деинициализировать наверное. или наоборот)
« Последнее редактирование: 17-12-2011 21:32 от Ochkarik » Записан

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

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

« Ответ #87 : 17-12-2011 21:40 » 

И всё таки, что это за блокированные страницы ввода-вывода?
PS
Спасибо за подсказку об отладке, попробую.
Не могу понять как пользоваться DbgView. Подскажите пожалуйста.

Добавлено через 3 часа, 11 минут и 44 секунды:
Не знаю в правильном ли я направлении действовал, но в конце ничего не вышло, я понатыкал DbgView в исходнике драйвера, перебилдил его Buil'ом для Checked версии из DDK, и новый файл драйвера использовал при пошаговом проходе по моей использующей программе при открытом DbgView.  Никаких сообщений при проходе в DbgView не вышло. Похоже что-то не то я делал.  Меня одолевают смутные сомнения
PS Может кто-нибудь посмотрит опытным взглядом драйверописателя?



Добавлено через 7 часов, 17 минут и 17 секунд:
Всё пошли в DbgView отладочные сообщения. Просто я их первый раз в директиву не оформил.

* UseDriver.rar (771.11 Кб - загружено 3360 раз.)
* MyFirstDriver1.rar (33.27 Кб - загружено 3455 раз.)
« Последнее редактирование: 18-12-2011 08:53 от Fredwriter » Записан

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

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

« Ответ #88 : 18-12-2011 09:48 » 

в код драйвера вставляете функции DbgPrint("tochka1");
драйвер должен быть скомпилирован в Debug версии.
перед запуском драйвера запускаете DbgView. он выводит все выполненные в драйвере DbgPrint().
как printf() в консоли. по ним можно отследить все пройденные точки и состояния в драйвере.
в принципе то же самое можно сделать и функциями вывода в системный лог.

насчет блокирования - видимо драйвер лезет куда не должен)
Записан

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

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

« Ответ #89 : 18-12-2011 10:25 » 

Цитата
в код драйвера вставляете функции DbgPrint("tochka1");
Так я же вам уже написал, что сообщения пошли, я вставил DbgPrint() везде, где выводится сообщения в системный лог. Во вложении картинка DbgView.

Вот один из моих DbgView:
Код:
NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
GetMessage(MSG_READ, DeviceObject, NULL);
#if DBG
          DbgPrint("Read", MSG_READ);
        #endif
return STATUS_SUCCESS;

}
PS Может не там я DbgPrint'ы расставил? Подскажите пожалуйста, где например было бы правильно поставить, поконкретнее.

Добавлено через 1 час, 3 минуты и 6 секунд:
Никак не могу разобраться с этими DbgPrint'ами. Где их ставить? Хоть самому вместо них в драйвер залезать Быть такого не может

* DbgView.bmp (478.98 Кб - загружено 3097 раз.)
« Последнее редактирование: 18-12-2011 12:38 от Fredwriter » Записан

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

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

« Ответ #90 : 18-12-2011 13:12 » 

загрузку-выгрузку посмотрите...
на самом деле ставьте везде - кашу маслом не испортишь)

Код:
NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
GetMessage(MSG_READ, DeviceObject, NULL);
#if DBG
          DbgPrint("Read", MSG_READ);
        #endif
return STATUS_SUCCESS;

}
а где завершение IRP?! если это обработчик IRP.
http://support.microsoft.com/kb/320275/ru
ваш случай пятый скорее всего.

Добавлено через 1 минуту и 13 секунд:
и еще раз внимательно читайте описание драйвера который вы пытаетесь собрать.
http://drp.su/ru/driver_dev/03_01-8.htm

Добавлено через 1 минуту и 20 секунд:
что такое IRP
« Последнее редактирование: 18-12-2011 13:14 от Ochkarik » Записан

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

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

« Ответ #91 : 18-12-2011 13:23 » 

В том то и дело, что в книге не было в этих местах никакой обработки IRP. Там было только то, что я выложил. Ну ладно если надо, я могу это добавить, но разве в этом проблема? Может он из-за этого комп вырубать?
Записан

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

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

« Ответ #92 : 18-12-2011 13:39 » 

 Жжешь Улыбаюсь)
в книге приведены КУСКИ кода. это не значит что они будут работать без осознания ЧТО ИМЕННО они делают и ЗАЧЕМ!

пока вы не начнете хотя бы пытаться понять что за входные переменные к вам приходят в разных функциях, что с ними делать в той или иной ситуации, зачем и когда написанные вами функции вызываются  - дальнейший разговор бессмыслен)
« Последнее редактирование: 18-12-2011 13:41 от Ochkarik » Записан

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

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

« Ответ #93 : 18-12-2011 13:50 » 

Хорошо, в книге приведены куски кода, и это не значит что они будут работать без осознания ЧТО ИМЕННО они делают и ЗАЧЕМ! Я пишу драйвер в первый раз в жизни, и некоторые понятия еще до конца в голове не уложились, поэтому могу по крупному тупить, а вы вместо того, что-бы ржать поддержали бы меня бедолагу), и пожалуйста, помогли бы мне прямыми ответами на вопросы, теория она обычно со временем приходит во всяком случае в в моём случае.
PS Ведь согласитесь, программирование в режиме ядра отличается от программирования в обычном родном пользовательском режиме. И тем более программирование драйверов содержит огромное кол-во теории с которой не так то легко справиться. И еще я писал то раньше на Delphi, и пришлось мне Си немного изучить - объём информации еще больше вырастает. Поэтому я и завёл эту тему я думал, что этот форум для этого и нужен.
« Последнее редактирование: 18-12-2011 14:14 от Fredwriter » Записан

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

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

« Ответ #94 : 18-12-2011 14:13 » 

а вы вопросы учитесь правильные задавать)
в правильном вопросе содержится часть ответа)
Цитата
В том то и дело, что в книге не было в этих местах никакой обработки IRP. Там было только то, что я выложил. Ну ладно если надо, я могу это добавить, но разве в этом проблема?
Может он из-за этого комп вырубать?
1. есть такая вероятность.
2. может.
я вам достаточно четко пытаюсь задать направление куда копать дальше... можете копать. а можете не копать)
Записан

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

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

« Ответ #95 : 18-12-2011 14:16 » 

Это то я копну конечно вроде не глубоко.)

Добавлено через 1 час, 31 минуту и 7 секунд:
Поставил завершение IRP запроса везде, где надо все равно вырубает как-будто так и надо).
Вот так я поставил завершение IRP - запроса:
Код:
NTSTATUS ReadMyDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    NTSTATUS status = STATUS_SUCCESS;
    GetMessage(MSG_READ, DeviceObject, NULL);
    #if DBG
      DbgPrint("Read", MSG_READ);
    #endif
    Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
    return status;  

}

« Последнее редактирование: 18-12-2011 15:47 от Fredwriter » Записан

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

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

« Ответ #96 : 18-12-2011 19:52 » 

   irp->IoStatus.Information = 0;
еще.


ищите выполнение какой из функции драйвера приводит к результату.
отключите все кроме DriverEntry и Unload, потом включайте по очереди. проверяя загрузку-выгрузку по паре раз.
в Unload тоже DbgPrint поместите...
« Последнее редактирование: 18-12-2011 19:56 от Ochkarik » Записан

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

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

« Ответ #97 : 18-12-2011 20:32 » 

спасибо за поддержку, но у меня теперь не перезагружается, я немного изменил код управляющей программы, теперь у меня она работает по следующей последовательности:
1 - загрузка
2 - открытие
4 - запись
5 - чтение
3 - закрытие
9 - выгрузка

Записан

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

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

« Ответ #98 : 19-12-2011 22:00 » 

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

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: 1 2 3 4 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines