Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2011, 18:11   #1
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию Непонятная ошибка

Здравствуйте, подскажите пожалуйста, что за ошибка?
assignment from incompatible pointer type
Ошибка с 52 по 57 строки.
Вот текст на Си
Код:
#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;
}
Ищущий да обрящет

Последний раз редактировалось fredwriter; 27.10.2011 в 18:13.
fredwriter вне форума Ответить с цитированием
Старый 27.10.2011, 18:19   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Уважаемый, и где у вас строчки с 52 по 57?!

Но, судя по сообщению, я могу предположить, что вы пытаетесь выполнить присваивание одного объекта другому через разыменование указателя, когда тип данных этого указателя полностью не определен.

Например,

Код:
struct A;

A *p1, *p2;
...
*p1 = *p2;
Здесь нельзя выполнить присваивание, так как тип struct A не полный.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 27.10.2011, 18:22   #3
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Сыроежка, Вот эти строчки в функции 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;
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 27.10.2011, 18:28   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от fredwriter Посмотреть сообщение
Сыроежка, Вот эти строчки в функции 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;
Ну, вам компилятор выдал совершенно ясное сообщение об ошибке "assignment from incompatible pointer type". Что вы от нас-то хотите? Я вам уже объяснил, что это значит. Либо тип DriverObject, либо тип MajorFunction не имеет полного определения в области видимости.

Пардон, я спутал слова incompatible и incomplete. Значит у вас в левой и правой части оператора присваивания стоят несовместимые типы.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 27.10.2011 в 18:30.
Сыроежка вне форума Ответить с цитированием
Старый 27.10.2011, 18:28   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Типа считать строки предоставляется читателям в качестве самостоятельного упражнения?

О! Попробуйте добавить #include <writeEvent.h>

Последний раз редактировалось Abstraction; 27.10.2011 в 18:31.
Abstraction вне форума Ответить с цитированием
Старый 27.10.2011, 18:36   #6
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Abstraction, 32 бита,
Цитата:
Типа считать строки предоставляется читателям в качестве самостоятельного упражнения?
Есть такие оформители кода, которые нумеруют строки, я думал что этот тоже пронумерует.

Сыроежка, Объект DriverObject типа PDRIVER_OBJECT.
Ниже в функции MyDriverUnload есть строчка
Код:
IoDeleteDevice(DriverObject->DeviceObject);
, где никакой ошибки нет.
Значит че-то с MajorFunction, но в функции GetMessage есть строчка:
Код:
Log_Packet->MajorFunctionCode = IrpStackLocation->MajorFunction;
, где тоже нет ошибок. Непонятно.
Ищущий да обрящет

Последний раз редактировалось fredwriter; 27.10.2011 в 18:42.
fredwriter вне форума Ответить с цитированием
Старый 27.10.2011, 18:44   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от fredwriter Посмотреть сообщение
Abstraction, 32
Сыроежка, Объект DriverObject типа PDRIVER_OBJECT.
Ниже в функции MyDriverUnload есть строчка
Код:
IoDeleteDevice(DriverObject->DeviceObject);
, где никакой ошибки нет.
Значит че-то с MajorFunction, но в функции GetMessage есть строчка:
Код:
Log_Packet->MajorFunctionCode = IrpStackLocation->MajorFunction;
, где тоже нет ошибок. Непонятно.
Трудно судить по вашему коду, так как не известны типы DriverObject, MajorFunction и, например, CreateMyDriver.

Может быть тип CreateMyDriver не совместим с типом DriverObject->MajorFunction[IRP_MJ_CREATE]
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 27.10.2011, 18:51   #8
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Abstraction, WriteEvent не помог, но он очень старался.
Сыроежка, Этот код из книги по написанию драйверов, и это очень важные строки. Может быть в книге не рабочий код?
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 27.10.2011, 18:55   #9
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Может быть тип [B
CreateMyDriver[/B] не совместим с типом DriverObject->MajorFunction[IRP_MJ_CREATE]
и ниже до строчки
Код:
return STATUS_SUCCESS;
всё тоже не совместимо?

погуглил, погуглил и нашел много примеров подобного кода где, я думаю это значит, что всё со всем совместимо, но где же тогда косяк?
Ищущий да обрящет

Последний раз редактировалось Stilet; 28.10.2011 в 08:24.
fredwriter вне форума Ответить с цитированием
Старый 27.10.2011, 20:59   #10
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А если попробовать эксперимент: закомментировать назначения обработчиков, а вместо них написать
Код:
PDEVICE_OBJECT a = NULL;
PIRP b=NULL;
(DriverObject->MajorFunction[IRP_MJ_CREATE])(a,b);
Оно скомпилируется? А если нет, то с какой ошибкой?
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятная ошибка optimator C++ Builder 4 23.12.2010 17:20
непонятная ошибка Mikuro Помощь студентам 0 12.11.2010 20:49
VS C++,непонятная ошибка RFbager Общие вопросы C/C++ 4 31.10.2010 03:30
Непонятная ошибка. jojahti Общие вопросы C/C++ 4 05.09.2009 20:39
Непонятная ошибка RealSHELS Общие вопросы Delphi 16 24.10.2008 20:49