Ошибки при сборке кода С

Тема в разделе "WASM.BEGINNERS", создана пользователем Llirik, 15 апр 2011.

  1. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Booster
    Верно - это конечный автомат. Просто мне понравилась и запомнилась эта идея, возможно в связи с тем, что она для меня новая т.к. в ВУЗе нам паттерны не преподавали и встретился я с ними позже. Уже довольно редко я открываю для себя новые горизонты в программировании:)
     
  2. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я изучал только ассемблер, но примеров того, что я сейчас делаю, на асме, к сожалению, нет, поэтому приходится копаться в примерах на С. Переведённая мною на асм функция работает (проверял), но я никак не могу получить скан-коды коды клавиш. Вот и хочу выяснить почему
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    я бы канеш не стал менять структуру из ddk...

    по поводу ошибок, пробуем так:
    Код (Text):
    1. #ifndef KBFILTER_H
    2. #define KBFILTER_H
    3.  
    4. #include "ntddk.h"
    5. #include "kbdmou.h"
    6. #include <ntddkbd.h>
    7. #include <ntdd8042.h>
    8.  
    9. typedef struct _DEVICE_EXTENSION
    10. {
    11.    
    12.     PDEVICE_OBJECT  Self;
    13.     PDEVICE_OBJECT  PDO;
    14.     PDEVICE_OBJECT  TopOfStack;
    15.     BOOLEAN         Started;
    16.     BOOLEAN         SurpriseRemoved;
    17.     BOOLEAN         Removed;
    18.     struct _UPPER_CONNECT {
    19.     PDEVICE_OBJECT     ClassDeviceObject;
    20.     PVOID    ClassService;
    21.     } UpperConnectData;
    22. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    23.  
    24. typedef struct _KEYBOARD_INPUT_DATA {
    25.   USHORT  UnitId;
    26.   USHORT  MakeCode;
    27.   USHORT  Flags;
    28.   USHORT  Reserved;
    29.   ULONG  ExtraInformation;
    30. } KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
    31.  
    32. //
    33. // Prototypes
    34. //
    35.  
    36. VOID
    37. KbFilter_ServiceCallback(
    38.     IN PDEVICE_OBJECT DeviceObject,
    39.     IN PKEYBOARD_INPUT_DATA InputDataStart,
    40.     IN PKEYBOARD_INPUT_DATA InputDataEnd,
    41.     IN OUT PULONG InputDataConsumed
    42.     );
    43.    
    44. NTSTATUS
    45. KbFilter_InternIoCtl (
    46.     IN PDEVICE_OBJECT DeviceObject,
    47.     IN PIRP Irp
    48.     );
    49.  
    50. NTSTATUS
    51. FiDO_DispatchPassThrough(
    52.         IN PDEVICE_OBJECT DeviceObject,
    53.         IN PIRP Irp
    54.         );
    55.    
    56. #endif  // KBFILTER_H
    Код (Text):
    1. #include "kbfiltr.h"
    2. #ifdef ALLOC_PRAGMA
    3. #pragma alloc_text (PAGE, KbFilter_InternIoCtl)
    4. #endif
    5. extern int ScanCode;
    6. //extern int FiDO_DispatchPassThrough;
    7. NTSTATUS
    8. KbFilter_InternIoCtl(
    9.     IN PDEVICE_OBJECT DeviceObject,
    10.     IN PIRP Irp
    11.     )
    12. {
    13.     PIO_STACK_LOCATION              irpStack;
    14.     PDEVICE_EXTENSION               devExt;
    15.     PCONNECT_DATA                   connectData;
    16.     NTSTATUS                        status = STATUS_SUCCESS;
    17.  
    18.     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    19.     Irp->IoStatus.Information = 0;
    20.     irpStack = IoGetCurrentIrpStackLocation(Irp);
    21.  
    22.     switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {
    23.  
    24.     case IOCTL_INTERNAL_KEYBOARD_CONNECT:
    25.         if (devExt->UpperConnectData.ClassService != NULL) {
    26.             status = STATUS_SHARING_VIOLATION;
    27.             break;
    28.         }
    29.         else if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
    30.                 sizeof(CONNECT_DATA)) {
    31.             //
    32.             // invalid buffer
    33.             //
    34.             status = STATUS_INVALID_PARAMETER;
    35.             break;
    36.         }
    37.  
    38.         connectData = ((PCONNECT_DATA)
    39.             (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
    40.  
    41.         devExt->UpperConnectData = *connectData;
    42.         connectData->ClassDeviceObject = devExt->Self;
    43.         connectData->ClassService = KbFilter_ServiceCallback;
    44.  
    45.         break;
    46.  
    47.     //
    48.      return FiDO_DispatchPassThrough(DeviceObject, Irp);
    49. }
    50.  
    51.  
    52.  
    53. VOID
    54. KbFilter_ServiceCallback(
    55.     IN PDEVICE_OBJECT DeviceObject,
    56.     IN PKEYBOARD_INPUT_DATA InputDataStart,
    57.     IN PKEYBOARD_INPUT_DATA InputDataEnd,
    58.     IN OUT PULONG InputDataConsumed
    59.     )
    60.  
    61. {
    62.     PDEVICE_EXTENSION   devExt;
    63.  
    64.     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    65.  
    66.     (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
    67.         devExt->UpperConnectData.ClassDeviceObject,
    68.         InputDataStart,
    69.         InputDataEnd,
    70.         InputDataConsumed);
    71.      ScanCode = InputDataStart->MakeCode;
    72. }
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Rel, теперь ошибки:
    Код (Text):
    1. 1>kbfiltr.h(24) : error C2011: '_KEYBOARD_INPUT_DATA' : 'struct' type redefinition
    2. 1>kbfiltr.c(40) : error C2115: '=' : incompatible types
    3. 1>kbfiltr.c(53) : error C2143: syntax error : missing ';' before 'type'
    4. 1>kbfiltr.c(67) : error C2065: 'InputDataStart' : undeclared identifier
    5. 1>kbfiltr.c(67) : error C4022: 'function through pointer' : pointer mismatch for actual parameter 2
    6. 1>kbfiltr.c(68) : error C2065: 'InputDataEnd' : undeclared identifier
    7. 1>kbfiltr.c(68) : error C4022: 'function through pointer' : pointer mismatch for actual parameter 3
    8. 1>kbfiltr.c(69) : error C2065: 'InputDataConsumed' : undeclared identifier
    9. 1>kbfiltr.c(69) : error C4022: 'function through pointer' : pointer mismatch for actual parameter 4
    10. 1>kbfiltr.c(70) : error C2223: left of '->MakeCode' must point to struct/union
    , а структуру _DEVICE_EXTENSION создаёт сам программист, просто в примере из ddk было:
    Код (Text):
    1. typedef struct _DEVICE_EXTENSION
    2. {
    3. ...................
    4.     CONNECT_DATA UpperConnectData;
    5. ....................
    6. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    а я просто сделал:
    Код (Text):
    1. _DEVICE_EXTENSION STRUCT
    2. ....................
    3.     ClassDeviceObject PDEVICE_OBJECT ?
    4.     ClassService PVOID ?
    5. ......................
    6. _DEVICE_EXTENSION ENDS
    7. P_DEVICE_EXTENSION typedef ptr _DEVICE_EXTENSION
    и у меня размер структуры _DEVICE_EXTENSION почему-то получился меньше на байт
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Оказывается просто } не хватало) осталась одна ошибка на строке

    devExt->UpperConnectData = *connectData;

    1>kbfiltr.c(40) : error C2115: '=' : incompatible types
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    Код (Text):
    1. devExt->UpperConnectData = *((struct _UPPER_CONNECT*)connectData);
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Rel, Благодарю. Код на С работает, но я никак не могу понять, почему получается разница в структурах байт. Оказывается именно из-за этого мой код на асме и не работает.
    С:
    асм:
    С:
    асм:
    Почему получается эта разница? Да и вообще правильно ли я перевёл с С на масм?
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    в си получается 16 потому, что три BOOLEAN'a выравниваются на стандартную границу в 4 байта... в асме, что написали - то и получили)
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    я вручную выровнял BOOLEAN`ы и коды вроде бы стали идентичны, но код на MASM`е по-прежнему не работает( Что я перевёл не так?? не понимаю(
    C:
    Код (Text):
    1. ..........................
    2.  
    3.         if (devExt->UpperConnectData.ClassService != NULL) {
    4.             status = STATUS_SHARING_VIOLATION;
    5.             break;
    6.         }
    7.         else if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
    8.                 sizeof(CONNECT_DATA)) {
    9.             //
    10.             // invalid buffer
    11.             //
    12.             status = STATUS_INVALID_PARAMETER;
    13.             break;
    14.         }
    15.  
    16.         connectData = ((PCONNECT_DATA)
    17.             (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
    18.  
    19. devExt->UpperConnectData = *((struct _UPPER_CONNECT*)connectData);
    20.         connectData->ClassDeviceObject = devExt->Self;
    21.         connectData->ClassService = KbFilter_ServiceCallback;
    22. ........................................
    23. VOID
    24. KbFilter_ServiceCallback(
    25.     IN PDEVICE_OBJECT DeviceObject,
    26.     IN PKEYBOARD_INPUT_DATA InputDataStart,
    27.     IN PKEYBOARD_INPUT_DATA InputDataEnd,
    28.     IN OUT PULONG InputDataConsumed
    29.     )
    30.  
    31. {
    32.     PDEVICE_EXTENSION   devExt;
    33.      ScanCode = InputDataStart->MakeCode;
    34.     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    35.  
    36.     (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
    37.         devExt->UpperConnectData.ClassDeviceObject,
    38.         InputDataStart,
    39.         InputDataEnd,
    40.         InputDataConsumed);
    41. }
    MASM:
    Код (Text):
    1. ........................
    2.  
    3.         .if [ecx].icnd.ClassService != NULL
    4.            mov status, STATUS_SHARING_VIOLATION
    5.         .elseif [edi].Parameters.DeviceIoControl.InputBufferLength < 8
    6.     mov status, STATUS_INVALID_PARAMETER;
    7.     .else
    8.     mov eax, [edi].Parameters.DeviceIoControl.Type3InputBuffer
    9.     assume eax:ptr ICONNECT_DATA
    10.     mov ebx, [eax].ClassDeviceObject
    11.     mov [ecx].icnd.ClassDeviceObject, ebx
    12.     mov ebx, [eax].ClassService
    13.     mov [ecx].icnd.ClassService, ebx
    14.     mov ebx, [ecx].Self
    15.     mov [eax].ClassDeviceObject, ebx
    16.     mov [eax].ClassService, offset KKbFilter_ServiceCallback
    17. ............................................................
    18.  
    19.  
    20. KKbFilter_ServiceCallback proc pDeviceObject:PDEVICE_OBJECT, InputDataStart:PKEYBOARD_INPUT_DATA, InputDataEnd:PKEYBOARD_INPUT_DATA, InputDataConsumed:PULONG
    21.     movzx eax, (KEYBOARD_INPUT_DATA ptr [InputDataEnd]).MakeCode
    22.     mov ScanCode, eax
    23.     push    InputDataConsumed
    24.     mov eax, pDeviceObject
    25.     push    InputDataEnd
    26. assume eax:ptr DEVICE_OBJECT
    27. mov ecx, [eax].DeviceExtension
    28. assume eax:nothing
    29. assume ecx:ptr FiDO_DEVICE_EXTENSION
    30.     push    InputDataStart
    31.     push    [ecx].icnd.ClassDeviceObject
    32.     call    [ecx].icnd.ClassService
    33. ret
    34. KKbFilter_ServiceCallback endp
    Пожалуйста, помогите мне всё-таки докопаться до истины)
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я нашёл ошибку
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Rel, почему я не могу собрать этот проэтк? Выдаёт:
    Код (Text):
    1. 1>d:\winddk\2600~1.110\bin\makefile.def(758) : warning  U1050: Your .\sources. file must define the TARGETPATH= macro
    2. 1>d:\winddk\2600~1.110\bin\makefile.def(758) : warning  U1050: Your .\sources. file must define the TARGETPATH= macro
    3. 1>d:\winddk\2600~1.110\bin\makefile.def(758) : warning  U1050: Your .\sources. file must define the TARGETPATH= macro
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Rel, извините, но я английского не знаю и я не понял, что мне нужно сделать
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    разобрался) теперь пишет:
    Код (Text):
    1. 1>d:\winddk\2600~1.110\bin\i386mk.inc(379) : warning  U1023: syntax error in expression
    2. 1>d:\winddk\2600~1.110\bin\i386mk.inc(379) : warning  U1023: syntax error in expression
    3. 1>d:\winddk\2600~1.110\bin\i386mk.inc(379) : warning  U1023: syntax error in expression
     
  15. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я этот пример вообще не изменял. Как был в dkk так и выложил. Помогите, пож.
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Пожалуйста, помогите мне собрать вот такой проект. он не много не обычный
     
  17. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Всё. я его собрал