Эмуляция нажатия кнопок из драйвера [WinXP]

Тема в разделе "WASM.BEGINNERS", создана пользователем punxer, 28 июл 2010.

  1. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Хоть и Солдатова тут обхаяли, но все же возьми его книгу да посмотри, там был шаблон стандартного драйвера, у тебя ошибки просто на начальном этапе уже
     
  2. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    2punxer
    потомучто надо SymbolicLink создать на свой устройство в доступном месте (\??\, etc). Почитай Four-F =)), скачай Валтера Они и читай, читай, читай, изредка пробуя. Если проект горит, то тебя проще будет заплатить, тк драйверы не та область в которую можно въехать с ходу.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    punxer
    терпеть не могу подобное в коде. Такое надо помещать или в свойствах проекта или в мэйк-файле или в батнике опцией к компиллеру "/D", если уж нато пошло
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. #define _X86_
    2. #define _DDK_DRIVER_
    3. #define DBG
    4.  
    5. #include <ntddk.h>
    6.  
    7. #ifndef _DRIVER_H_04802_BASHBD_1UIWQ1_8239_1NJKDH832_901_
    8. #define _DRIVER_H_04802_BASHBD_1UIWQ1_8239_1NJKDH832_901_
    9. // Выше приведены две строки (в конце файла имеется еще #endif),
    10. // которые в больших проектах запрещают повторные  проходы по тексту,
    11. // который находится внутри h-файла (что весьма удобно для повышения
    12. // скорости компиляции).
    13. // (Файл Driver.h)
    14.  
    15. #ifdef __cplusplus
    16. extern "C"
    17. {
    18. #endif
    19.  
    20. #include "ntddk.h"
    21.  
    22. //#include "wdm.h"
    23. // ^^^^^^^^^^^^^^ если выбрать эту строку и закомментировать
    24. // предыдущую, то компиляция  в среде DDK (при помощи утилиты Build)
    25. // также пройдет успешно, однако драйвер Example не станет от этого
    26. // настоящим WDM драйвером.
    27.  
    28. #ifdef __cplusplus
    29. }
    30. #endif
    31. // Определяем структуру расширения устройства. Включим в нее
    32. // указатель на FDO (для удобства последующей работы UnloadRoutine) и
    33. // имя символьной ссылки в формате UNOCODE_STRING.
    34.  
    35. typedef struct _EXAMPLE_DEVICE_EXTENSION
    36. {
    37.     PDEVICE_OBJECT  fdo;
    38.     UNICODE_STRING  ustrSymLinkName; // L"\\DosDevices\\Example"
    39. } EXAMPLE_DEVICE_EXTENSION, *PEXAMPLE_DEVICE_EXTENSION;
    40.  
    41. // Определяем собственные коды IOCTL, с которыми можно будет
    42. // обращаться к драйверу при помощи вызова DeviceIoControl.
    43. // Определение макроса CTL_CODE можно найти в файле DDK Winioctl.h.
    44. // Там же можно найти и численные значения, скрывающиеся под именами
    45. // METHOD_BUFFERED и METHOD_NEITHER.
    46.  
    47. // Внимание! Текст приведенный ниже должен войти в файл Ioctl.h,
    48. // который будет необходим для компиляции тестового приложения.
    49. // (Разумеется, за исключением последней строки с "#endif".)
    50.  
    51. #define IOCTL_PRINT_DEBUG_MESS CTL_CODE( \
    52.     FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
    53.  
    54. #define IOCTL_CHANGE_IRQL CTL_CODE(\
    55.     FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
    56.  
    57. #define IOCTL_MAKE_SYSTEM_CRASH CTL_CODE( \
    58.     FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
    59.  
    60. #define IOCTL_TOUCH_PORT_378H CTL_CODE( \
    61.     FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
    62.  
    63. #define IOCTL_SEND_BYTE_TO_USER CTL_CODE( \
    64.     FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
    65.  
    66. // Вариант :
    67. //#define IOCTL_SEND_BYTE_TO_USER CTL_CODE( \
    68. //    FILE_DEVICE_UNKNOWN, 0x805, METHOD_NEITHER, FILE_ANY_ACCESS)
    69. #endif
    70.  
    71.  
    72. // Предварительные объявления функций:
    73. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp );
    74. VOID     UnloadRoutine(IN PDRIVER_OBJECT DriverObject);
    75. NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp );
    76. NTSTATUS Create_File_IRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    77. NTSTATUS Close_HandleIRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    78. NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info);
    79.  
    80. // Хотя и нехорошо делать глобальные переменные в драйвере...
    81. KSPIN_LOCK MySpinLock;
    82. #pragma code_seg("INIT") // начало секции INIT
    83. /////////////////////////////////////////////////////////////////////
    84. // (Файл init.cpp)
    85. // DriverEntry - инициализация драйвера и необходимых объектов
    86. // Аргументы:  указатель на объект драйвера
    87. //             раздел реестра (driver service key) в UNICODE
    88. // Возвращает: STATUS_Xxx
    89.  
    90.  
    91. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
    92.                       IN PUNICODE_STRING RegistryPath  )
    93. {
    94.     NTSTATUS status = STATUS_SUCCESS;
    95.     PDEVICE_OBJECT  fdo;
    96.     UNICODE_STRING  devName;
    97.  
    98.     #if DBG
    99.     DbgPrint("=Example= In DriverEntry.");
    100.     DbgPrint("=Example= RegistryPath = %ws.", RegistryPath->Buffer);
    101.     #endif
    102.  
    103.     // Экспорт точек входа в драйвер (AddDevice объявлять не будем)
    104.     // DriverObject->DriverExtension->AddDevice= OurAddDeviceRoutine;
    105.     DriverObject->DriverUnload = UnloadRoutine;
    106.     DriverObject->MajorFunction[IRP_MJ_CREATE]= Create_File_IRPprocessing;
    107.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = Close_HandleIRPprocessing;
    108.     DriverObject->MajorFunction[IRP_MJ_READ]  = ReadWrite_IRPhandler;
    109.     DriverObject->MajorFunction[IRP_MJ_WRITE] = ReadWrite_IRPhandler;
    110.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DeviceControlRoutine;
    111.     //========================================================
    112.     // Действия по созданию символьной ссылки
    113.     // (их нужно было бы делать в OurAddDeviceRoutine, но у нас
    114.     // очень простой драйвер и эта процедура отсутствует):
    115.     RtlInitUnicodeString( &devName, L"\\Device\\EXAMPLE" );
    116.  
    117.     // Создаем наш Functional Device Object (FDO) и получаем
    118.     // указатель на созданный FDO в нашей переменной fdo.  
    119.     // (В WDM драйвере эту работу также следовало бы выполнять
    120.     // в процедуре OurAddDeviceRoutine.) При создании FDO
    121.     // будет выделено место и под структуру расширения устройства
    122.     // EXAMPLE_DEVICE_EXTENSION (для этого мы передаем в вызов
    123.     // ее размер, вычисляемый оператором sizeof):
    124.     status = IoCreateDevice(DriverObject,
    125.                             sizeof(EXAMPLE_DEVICE_EXTENSION),
    126.                             &devName, // может быть и NULL
    127.                             FILE_DEVICE_UNKNOWN,
    128.                             0,
    129.                             FALSE, // без эксклюзивного доступа
    130.                             &fdo);
    131.     if(!NT_SUCCESS(status)) return status;
    132.  
    133.     // Получаем указатель на область, предназначенную под
    134.     // структуру расширение устройства
    135.     PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension;
    136.     dx->fdo = fdo;  // Сохраняем обратный указатель
    137.  
    138.     // Применяя прием условной компиляции, вводим функцию DbgPrint,
    139.     // сообщения которой мы сможем увидеть в окне DebugView, если
    140.     // выполним сборку нашего драйвера как checked (отладочную)
    141.     // версию:
    142.     #if DBG
    143.     DbgPrint("=Example= FDO %X, DevExt=%X.",fdo,dx);
    144.     #endif
    145.  
    146.     //=======================================
    147.     // Действия по созданию символьной ссылки
    148.     // (их нужно было бы делать в OurAddDeviceRoutine, но у нас
    149.     // очень простой драйвер):
    150.     UNICODE_STRING symLinkName;   // Сформировать символьное имя:
    151.     // #define   SYM_LINK_NAME   L"\\??\\Example"
    152.     // Такого типа символьные ссылки ^^ проходят только в NT.
    153.     // (То есть, если перенести бинарный файл драйвера в
    154.     // Windows 98, то пользовательские приложения заведомо
    155.     // не смогут открыть файл по такой символьной ссылке.)
    156.     // Для того, чтобы ссылка работала в и Windows 98 и в NT,
    157.     // необходимо поступать следующим образом:
    158.     #define SYM_LINK_NAME   L"\\DosDevices\\Example"
    159.     RtlInitUnicodeString( &symLinkName, SYM_LINK_NAME );
    160.     dx->ustrSymLinkName = symLinkName;
    161.    
    162.     // Создаем символьную ссылку
    163.     status = IoCreateSymbolicLink( &symLinkName, &devName );
    164.     if (!NT_SUCCESS(status))
    165.     { // при неудаче √ удалить Device Object и вернуть управление
    166.         IoDeleteDevice( fdo );
    167.         return status;
    168.         } // Теперь можно вызывать CreateFile("\\\\.\\Example",...);
    169.           // в пользовательских приложениях
    170.  
    171.         // Объект спин-блокировки, который будем использовать для
    172.         // разнесения во времени выполнения кода обработчика
    173.         // IOCTL запросов. Инициализируем его:
    174.         KeInitializeSpinLock(&MySpinLock);
    175.  
    176.         // Снова используем условную компиляцию, чтобы выделить код,
    177.         // компилируемый в отладочной версии и не компилируемый в
    178.         // версии free (релизной):
    179.         #if DBG
    180.         DbgPrint("=Example= DriverEntry successfully completed.");
    181.         #endif
    182.         return status;
    183. }
    184. #pragma code_seg() // end INIT section
    185.  
    186. NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info)
    187. {
    188.     Irp->IoStatus.Status = status;
    189.     Irp->IoStatus.Information = info;
    190.     IoCompleteRequest(Irp,IO_NO_INCREMENT);
    191.     return status;
    192. }
    193. //
    194. // (Файл init.cpp)
    195. // ReadWrite_IRPhandler: Берет на себя обработку запросов
    196. // чтения/записи и завершает обработку IRP вызовом CompleteIrp
    197. // с числом переданных/полученных байт (BytesTxd) равным нулю.
    198. // Аргументы:
    199. // Указатель на объект нашего FDO
    200. // Указатель на структуру IRP, поступившего от Диспетчера ввода/вывода
    201. NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    202. {
    203.     ULONG BytesTxd = 0;
    204.     NTSTATUS status = STATUS_SUCCESS; //Завершение с кодом status
    205.     // Задаем печать отладочных сообщений √ если сборка отладочная
    206.     #if DBG
    207.     DbgPrint("-Example- in ReadWrite_IRPhandler.");
    208.     #endif
    209.     return CompleteIrp(Irp,status,BytesTxd);
    210. }
    211.  
    212. NTSTATUS Create_File_IRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    213. {
    214.     PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    215.     // Задаем печать отладочных сообщений - если сборка отладочная
    216.     #if DBG
    217.     DbgPrint("-Example- Create File is %ws",
    218.         &(IrpStack->FileObject->FileName.Buffer));
    219.     #endif
    220. return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
    221. }
    222.  
    223.  
    224. NTSTATUS Close_HandleIRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    225. {
    226.     #if DBG
    227.     // Задаем печать отладочных сообщений - если сборка отладочная
    228.     DbgPrint("-Example- In Close handler.");
    229.     #endif
    230. return CompleteIrp(Irp,STATUS_SUCCESS,0);// Успешное завершение
    231. }
    232. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    233. {
    234.     NTSTATUS status = STATUS_SUCCESS;
    235.     ULONG BytesTxd =0; // Число переданных/полученных байт (пока 0)
    236.     PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
    237.  
    238.     // Получаем указатель на расширение устройства
    239.     PEXAMPLE_DEVICE_EXTENSION dx =
    240.                  (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension;
    241.     //-------------------------------
    242.     // Выделяем из IRP собственно значение IOCTL кода, по поводу
    243.     // которого случился вызов:
    244.     ULONG ControlCode =
    245.     IrpStack->Parameters.DeviceIoControl.IoControlCode;
    246.     ULONG method = ControlCode & 0x03;
    247.  
    248.     // Получаем текущее значение уровня IRQL √ приоритета,
    249.     // на котором выполняется поток (вообще говоря, целое число):
    250.     KIRQL irql,
    251.     currentIrql = KeGetCurrentIrql();
    252.  
    253.     #if DBG
    254.     DbgPrint("-Example- In DeviceControlRoutine (fdo= %X)\n",fdo);
    255.     DbgPrint("-Example- DeviceIoControl: IOCTL %x.", ControlCode );
    256.     if(currentIrql==PASSIVE_LEVEL)
    257.         DbgPrint("-Example- PASSIVE_LEVEL (val=%d)",currentIrql);
    258.     #endif
    259.     // Запрашиваем владение объектом спин-блокировки. В данном
    260.     // примере не выполняется никаких критичных действий, но,
    261.     // вообще говоря, этот прием может быть полезен и даже
    262.     // незаменим, если в приведенном ниже коде должны будут
    263.     // выполнены манипуляции, которые можно делать только
    264.     // эксклюзивно. Пока потоку выделен объект спин-блокировки √
    265.     // никакой другой поток не сможет войти в оператор switch:
    266.     KeAcquireSpinLock(&MySpinLock,&irql);
    267.  
    268.     // Диспетчеризация по IOCTL кодам:
    269.     switch( ControlCode) {
    270.  
    271.     #ifndef SMALL_VERSION
    272.     case IOCTL_PRINT_DEBUG_MESS:
    273.     {     // Только вводим сообщение и только в отладочной версии
    274.         #if DBG
    275.         DbgPrint("-Example- IOCTL_PRINT_DEBUG_MESS.");
    276.         #endif
    277.         break;
    278.     }
    279.     case IOCTL_CHANGE_IRQL:
    280.     {
    281.         #if DBG
    282.         // Эксперименты по искусственному повышению
    283.         // IRQL √ только в отладочной версии!
    284.         DbgPrint("-Example- IOCTL_CHANGE_IRQL.");
    285.         KIRQL dl = DISPATCH_LEVEL, // только для распечатки (2)
    286.         oldIrql,
    287.         newIrql=25; // Новый уровень IRQL (например, 25)
    288.         // Устанавливаем newIrql, сохраняя текущий в oldIrql:
    289.         KeRaiseIrql(newIrql,&oldIrql);
    290.         newIrql=KeGetCurrentIrql(); // Что реально получили?
    291.  
    292.         DbgPrint("-Example- DISPATCH_LEVEL value =%d",dl);
    293.         DbgPrint("-Example- IRQLs are old=%d new=%d",
    294.                         oldIrql,newIrql);
    295.         KeLowerIrql(oldIrql); // Возвращаем старое значение
    296.         #endif
    297.         break;
    298.     }
    299.     #endif // SMALL_VERSION
    300.  
    301.  
    302.     case IOCTL_MAKE_SYSTEM_CRASH:
    303.     {
    304.         int errDetected=0;
    305.         char x = (char)0xFF;
    306.  
    307.         #if DBG  // Вообще говоря, под NT мы этого уже не увидим:
    308.         DbgPrint("-Example- IOCTL_MAKE_SYSTEM_CRASH.");
    309.         #endif
    310.         // Вызываем системный сбой обращением по нулевому адресу
    311.         __try {
    312.         x = *(char*)0x0L; // ошибочная ситуация
    313.             //^^^^^^^^^^^^ здесь случится сбой NT, но не Win98
    314.         }
    315.         __except(EXCEPTION_EXECUTE_HANDLER)
    316.         {   // Перехват исключения не работает!
    317.             // Эта занимательная ситуация объяснена в 10.2.6,
    318.             // при рассмотрении объектов спин-блокировок.
    319.             errDetected=1;
    320.         };
    321.         #if DBG
    322.         DbgPrint("-Example- Value of x is %X.",x);
    323.         if(errDetected)
    324.             DbgPrint("-Example- Except detected in Example driver.");
    325.         #endif
    326.         break;
    327.     }
    328.  
    329.     #ifndef SMALL_VERSION
    330.     case IOCTL_TOUCH_PORT_378H:
    331.     {  
    332.         unsigned short ECRegister = 0x378+0x402;
    333.         #if DBG
    334.         DbgPrint("-Example- IOCTL_TOUCH_PORT_378H.");
    335.         #endif
    336.         // Пробуем программно перевести параллельный порт 378,
    337.         // сконфигурированный средствами BIOS как ECP+EPP, в
    338.         // режим EPP.
    339.         _asm  {
    340.             mov dx,ECRegister ;
    341.             xor al,al    ;
    342.             out dx,al    ;    Установить EPP mode 000
    343.             mov al,095h  ;    Биты 7:5 = 100
    344.             out dx,al    ;    Установить EPP mode 100
    345.         }
    346.         // Подобные действия в приложении пользовательского
    347.         // режима под NT  обязательно привело бы к аварийной
    348.         // выгрузке приложения с сообщением об ошибке!
    349.         // Практически эти пять строк демонстрируют, что можно
    350.         // работать с LPT портом под Windows NT !
    351.         break;
    352.     }
    353.  
    354.     case IOCTL_SEND_BYTE_TO_USER:
    355.     {  
    356.         // Размер данных, поступивших от пользователя:
    357.         ULONG InputLength = //только лишь для примера
    358.             IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    359.         // Размер буфера для данных, ожидаемых пользователем
    360.         ULONG OutputLength =
    361.         IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    362.         #if DBG
    363.         DbgPrint("-Example- Buffer outlength %d",OutputLength);
    364.         #endif
    365.  
    366.         if( OutputLength<1 )
    367.         {// Если не предоставлен буфер √ завершить IRP с ошибкой
    368.             status = STATUS_INVALID_PARAMETER;
    369.             break;
    370.         }
    371.         UCHAR *buff; // unsigned char, привыкаем к новой нотации
    372.         if(method==METHOD_BUFFERED)
    373.         {
    374.             buff = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
    375.             #if DBG
    376.             DbgPrint("-Example- Method : BUFFERED.");
    377.             #endif
    378.         }
    379.         else
    380.             if (method==METHOD_NEITHER)
    381.             {
    382.                 buff=(unsigned char*)Irp->UserBuffer;
    383.                 #if DBG
    384.                 DbgPrint("-Example- Method : NEITHER.");
    385.                 #endif
    386.             }
    387.             else
    388.             {
    389.                 #if DBG
    390.                 DbgPrint("-Example- Method : unsupported.");
    391.                 #endif
    392.                 status = STATUS_INVALID_DEVICE_REQUEST;
    393.                 break;
    394.             }
    395.         #if DBG
    396.         DbgPrint("-Example- Buffer address is %08X",buff);
    397.         #endif
    398.         *buff=33;     // Любимое число Штирлица
    399.         BytesTxd = 1; // Передали 1 байт
    400.         break;
    401.     }
    402.     #endif // SMALL_VERSION
    403.     // Ошибочный запрос (код IOCTL, который не обрабатывается):
    404.     default: status = STATUS_INVALID_DEVICE_REQUEST;
    405.     }
    406.     // Освобождение спин-блокировки
    407.     KeReleaseSpinLock(&MySpinLock,irql);
    408.  
    409.     #if DBG
    410.     DbgPrint("-Example- DeviceIoControl: %d bytes written.", (int)BytesTxd);
    411.     #endif
    412.  
    413. return CompleteIrp(Irp,status,BytesTxd); // Завершение IRP
    414. }
    415. #pragma code_seg("PAGE")
    416. // Допускает размещение в странично организованной памяти
    417. //
    418. VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    419. {
    420.     PDEVICE_OBJECT  pNextDevObj;
    421.     int i;
    422.  
    423.     // Задаем печать отладочных сообщений √ если сборка отладочная
    424.     #if DBG
    425.     DbgPrint("-Example- In Unload Routine.");
    426.     #endif
    427.     //==========================================================
    428.     // Нижеприведенные  операции в полномасштабном WDM драйвере
    429.     // следовало бы поместить в обработчике IRP_MJ_PNP запросов
    430.     // с субкодом IRP_MN_REMOVE_DEVICE, но в силу простоты
    431.     // драйвера, сделаем это здесь.
    432.     // Проходим по всем объектам устройств, контролируемым
    433.     // драйвером
    434.     pNextDevObj = pDriverObject->DeviceObject;
    435.  
    436.     for(i=0; pNextDevObj!=NULL; i++)
    437.     {
    438.         PEXAMPLE_DEVICE_EXTENSION dx =
    439.                 (PEXAMPLE_DEVICE_EXTENSION)pNextDevObj->DeviceExtension;
    440.         // Удаляем символьную ссылку и уничтожаем FDO:
    441.         UNICODE_STRING *pLinkName = & (dx->ustrSymLinkName);
    442.         // !!! сохраняем указатель:
    443.         pNextDevObj = pNextDevObj->NextDevice;
    444.  
    445.         #if DBG
    446.         DbgPrint("-Example- Deleted device (%d) : pointer to FDO = %X.",
    447.                             i,dx->fdo);
    448.         DbgPrint("-Example- Deleted symlink = %ws.", pLinkName->Buffer);
    449.         #endif
    450.  
    451.         IoDeleteSymbolicLink(pLinkName);
    452.         IoDeleteDevice( dx->fdo);
    453.     }
    454. }
    455. #pragma code_seg() // end PAGE section

    1>------ Rebuild All started: Project: drv, Configuration: Debug Win32 ------
    1>Deleting intermediate and output files for project 'drv', configuration 'Debug|Win32'
    1>Compiling...
    1>main.c
    1>.\main.c(134) : error C2275: 'PEXAMPLE_DEVICE_EXTENSION' : illegal use of this type as an expression
    1> .\main.c(38) : see declaration of 'PEXAMPLE_DEVICE_EXTENSION'
    1>.\main.c(134) : error C2146: syntax error : missing ';' before identifier 'dx'
    1>.\main.c(134) : error C2065: 'dx' : undeclared identifier
    1>.\main.c(134) : warning C4047: '=' : 'int' differs in levels of indirection from 'PEXAMPLE_DEVICE_EXTENSION'
    1>.\main.c(135) : error C2065: 'dx' : undeclared identifier
    1>.\main.c(135) : error C2223: left of '->fdo' must point to struct/union
    1>.\main.c(149) : error C2275: 'UNICODE_STRING' : illegal use of this type as an expression
    1> C:\WINDDK\2600\inc\ddk\wxp\ntdef.h(1092) : see declaration of 'UNICODE_STRING'
    1>.\main.c(149) : error C2146: syntax error : missing ';' before identifier 'symLinkName'
    1>.\main.c(149) : error C2065: 'symLinkName' : undeclared identifier
    1>.\main.c(158) : error C2065: 'symLinkName' : undeclared identifier
    1>.\main.c(158) : warning C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
    1>.\main.c(159) : error C2065: 'dx' : undeclared identifier
    1>.\main.c(159) : error C2223: left of '->ustrSymLinkName' must point to struct/union
    1>.\main.c(159) : error C2065: 'symLinkName' : undeclared identifier
    1>.\main.c(162) : error C2065: 'symLinkName' : undeclared identifier
    1>.\main.c(162) : warning C4133: 'function' : incompatible types - from 'int *' to 'PUNICODE_STRING'
    1>.\main.c(370) : error C2275: 'UCHAR' : illegal use of this type as an expression
    1> C:\WINDDK\2600\inc\ddk\wxp\ntdef.h(409) : see declaration of 'UCHAR'
    1>.\main.c(370) : error C2065: 'buff' : undeclared identifier
    1>.\main.c(373) : error C2065: 'buff' : undeclared identifier
    1>.\main.c(373) : warning C4047: '=' : 'int' differs in levels of indirection from 'PUCHAR'
    1>.\main.c(381) : error C2065: 'buff' : undeclared identifier
    1>.\main.c(381) : warning C4047: '=' : 'int' differs in levels of indirection from 'unsigned char *'
    1>.\main.c(397) : error C2065: 'buff' : undeclared identifier
    1>.\main.c(397) : error C2100: illegal indirection
    1>Build log was saved at "file://d:\Workplace\_Creative\vc2008\drv\drv\Debug\BuildLog.htm"
    1>drv - 19 error(s), 5 warning(s)
    ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    пример из солдатова
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    или это из за компиления в студии?
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    это из-за незнания языка Си.
    в данном примере даже Си не нужно знать, достаточно уметь читать.
    PS: подсказка - не хватает некоторых описаний структур.
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Дальнейшие попытки компиления привели вот к чему. (Win7 + DDKXP)
    Код (Text):
    1. /////////////////////////////////////////////////////////////////////
    2. // init.cpp: Инициализация драйвера
    3. // Замечание. Рабочая версия данного драйвера должна быть
    4. // скомпилирована как не-WDM версия. В противном случае - драйвер
    5. // не сможет корректно загружаться и выгружаться с использованием
    6. // программы monitor (пакет Numega Driver Studio) и сервисов SCM
    7. // Менеджера.
    8.  
    9. /////////////////////////////////////////////////////////////////////
    10. // DriverEntry            Главная точка входа в драйвер
    11. // UnloadRoutine          Процедура выгрузки драйвера
    12. // DeviceControlRoutine   Обработчик DeviceIoControl IRP пакетов
    13. /////////////////////////////////////////////////////////////////////
    14. #include "Driver.h"
    15.  
    16. // Предварительные объявления функций:
    17. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp );
    18. VOID     UnloadRoutine(IN PDRIVER_OBJECT DriverObject);
    19. NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp );
    20. NTSTATUS Create_File_IRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    21. NTSTATUS Close_HandleIRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
    22.  
    23. // Хотя и нехорошо делать глобальные переменные в драйвере...
    24. KSPIN_LOCK MySpinLock;
    25. #pragma code_seg("INIT") // начало секции INIT
    26. /////////////////////////////////////////////////////////////////////
    27. // (Файл init.cpp)
    28. // DriverEntry - инициализация драйвера и необходимых объектов
    29. // Аргументы:  указатель на объект драйвера
    30. //             раздел реестра (driver service key) в UNICODE
    31. // Возвращает: STATUS_Xxx
    32.  
    33. extern "C"
    34. NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
    35.                       IN PUNICODE_STRING RegistryPath  )
    36. {
    37.     NTSTATUS status = STATUS_SUCCESS;
    38.     PDEVICE_OBJECT  fdo;
    39.     UNICODE_STRING  devName;
    40.  
    41.     #if DBG
    42.     DbgPrint("=Example= In DriverEntry.");
    43.     DbgPrint("=Example= RegistryPath = %ws.", RegistryPath->Buffer);
    44.     #endif
    45.  
    46.     // Экспорт точек входа в драйвер (AddDevice объявлять не будем)
    47.     // DriverObject->DriverExtension->AddDevice= OurAddDeviceRoutine;
    48.     DriverObject->DriverUnload = UnloadRoutine;
    49.     DriverObject->MajorFunction[IRP_MJ_CREATE]= Create_File_IRPprocessing;
    50.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = Close_HandleIRPprocessing;
    51.     DriverObject->MajorFunction[IRP_MJ_READ]  = ReadWrite_IRPhandler;
    52.     DriverObject->MajorFunction[IRP_MJ_WRITE] = ReadWrite_IRPhandler;
    53.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DeviceControlRoutine;
    54.     //========================================================
    55.     // Действия по созданию символьной ссылки
    56.     // (их нужно было бы делать в OurAddDeviceRoutine, но у нас
    57.     // очень простой драйвер и эта процедура отсутствует):
    58.     RtlInitUnicodeString( &devName, L"\\Device\\EXAMPLE" );
    59.  
    60.     // Создаем наш Functional Device Object (FDO) и получаем
    61.     // указатель на созданный FDO в нашей переменной fdo.  
    62.     // (В WDM драйвере эту работу также следовало бы выполнять
    63.     // в процедуре OurAddDeviceRoutine.) При создании FDO
    64.     // будет выделено место и под структуру расширения устройства
    65.     // EXAMPLE_DEVICE_EXTENSION (для этого мы передаем в вызов
    66.     // ее размер, вычисляемый оператором sizeof):
    67.     status = IoCreateDevice(DriverObject,
    68.                             sizeof(EXAMPLE_DEVICE_EXTENSION),
    69.                             &devName, // может быть и NULL
    70.                             FILE_DEVICE_UNKNOWN,
    71.                             0,
    72.                             FALSE, // без эксклюзивного доступа
    73.                             &fdo);
    74.     if(!NT_SUCCESS(status)) return status;
    75.  
    76.     // Получаем указатель на область, предназначенную под
    77.     // структуру расширение устройства
    78.     PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension;
    79.     dx->fdo = fdo;  // Сохраняем обратный указатель
    80.  
    81.     // Применяя прием условной компиляции, вводим функцию DbgPrint,
    82.     // сообщения которой мы сможем увидеть в окне DebugView, если
    83.     // выполним сборку нашего драйвера как checked (отладочную)
    84.     // версию:
    85.     #if DBG
    86.     DbgPrint("=Example= FDO %X, DevExt=%X.",fdo,dx);
    87.     #endif
    88.  
    89.     //=======================================
    90.     // Действия по созданию символьной ссылки
    91.     // (их нужно было бы делать в OurAddDeviceRoutine, но у нас
    92.     // очень простой драйвер):
    93.     UNICODE_STRING symLinkName;   // Сформировать символьное имя:
    94.     // #define   SYM_LINK_NAME   L"\\??\\Example"
    95.     // Такого типа символьные ссылки ^^ проходят только в NT.
    96.     // (То есть, если перенести бинарный файл драйвера в
    97.     // Windows 98, то пользовательские приложения заведомо
    98.     // не смогут открыть файл по такой символьной ссылке.)
    99.     // Для того, чтобы ссылка работала в и Windows 98 и в NT,
    100.     // необходимо поступать следующим образом:
    101.     #define SYM_LINK_NAME   L"\\DosDevices\\Example"
    102.     RtlInitUnicodeString( &symLinkName, SYM_LINK_NAME );
    103.     dx->ustrSymLinkName = symLinkName;
    104.    
    105.     // Создаем символьную ссылку
    106.     status = IoCreateSymbolicLink( &symLinkName, &devName );
    107.     if (!NT_SUCCESS(status))
    108.     { // при неудаче v удалить Device Object и вернуть управление
    109.         IoDeleteDevice( fdo );
    110.         return status;
    111.         } // Теперь можно вызывать CreateFile("\\\\.\\Example",...);
    112.           // в пользовательских приложениях
    113.  
    114.         // Объект спин-блокировки, который будем использовать для
    115.         // разнесения во времени выполнения кода обработчика
    116.         // IOCTL запросов. Инициализируем его:
    117.         KeInitializeSpinLock(&MySpinLock);
    118.  
    119.         // Снова используем условную компиляцию, чтобы выделить код,
    120.         // компилируемый в отладочной версии и не компилируемый в
    121.         // версии free (релизной):
    122.         #if DBG
    123.         DbgPrint("=Example= DriverEntry successfully completed.");
    124.         #endif
    125.         return status;
    126. }
    127. #pragma code_seg() // end INIT section
    128.  
    129. //
    130. // (Файл init.cpp)
    131. // CompleteIrp: Устанавливает IoStatus и завершает обработку IRP
    132. // Первый аргумент - указатель на объект нашего FDO.
    133. //
    134. NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info)
    135. {
    136.     Irp->IoStatus.Status = status;
    137.     Irp->IoStatus.Information = info;
    138.     IoCompleteRequest(Irp,IO_NO_INCREMENT);
    139.     return status;
    140. }
    141.  
    142. //
    143. // (Файл init.cpp)
    144. // ReadWrite_IRPhandler: Берет на себя обработку запросов
    145. // чтения/записи и завершает обработку IRP вызовом CompleteIrp
    146. // с числом переданных/полученных байт (BytesTxd) равным нулю.
    147. // Аргументы:
    148. // Указатель на объект нашего FDO
    149. // Указатель на структуру IRP, поступившего от Диспетчера ввода/вывода
    150. NTSTATUS ReadWrite_IRPhandler( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    151. {
    152.     ULONG BytesTxd = 0;
    153.     NTSTATUS status = STATUS_SUCCESS; //Завершение с кодом status
    154.     // Задаем печать отладочных сообщений v если сборка отладочная
    155.     #if DBG
    156.     DbgPrint("-Example- in ReadWrite_IRPhandler.");
    157.     #endif
    158.     return CompleteIrp(Irp,status,BytesTxd);
    159. }
    160. //
    161. // (Файл init.cpp)
    162. // Create_File_IRPprocessing: Берет на себя обработку запросов с
    163. // кодом IRP_MJ_CREATE.
    164. // Аргументы:
    165. // Указатель на объект нашего FDO
    166. // Указатель на структуру IRP, поступившего от Диспетчера ВВ
    167. //
    168. NTSTATUS Create_File_IRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    169. {
    170.     PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    171.     // Задаем печать отладочных сообщений - если сборка отладочная
    172.     #if DBG
    173.     DbgPrint("-Example- Create File is %ws",
    174.         &(IrpStack->FileObject->FileName.Buffer));
    175.     #endif
    176. return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
    177. }
    178.  
    179. // (Файл init.cpp)
    180. // Close_File_IRPprocessing: Берет на себя обработку запросов с
    181. // кодом IRP_MJ_CLOSE.
    182. // Аргументы:
    183. // Указатель на объект нашего FDO
    184. // Указатель на структуру IRP, поступившего от Диспетчера ввода/вывода
    185. NTSTATUS Close_HandleIRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    186. {
    187.     #if DBG
    188.     // Задаем печать отладочных сообщений - если сборка отладочная
    189.     DbgPrint("-Example- In Close handler.");
    190.     #endif
    191. return CompleteIrp(Irp,STATUS_SUCCESS,0);// Успешное завершение
    192. }
    193.  
    194. // (Файл init.cpp)
    195. // DeviceControlRoutine: обработчик IRP_MJ_DEVICE_CONTROL запросов
    196. // Аргументы:
    197. // Указатель на объект нашего FDO
    198. // Указатель на структуру IRP, поступившего от Диспетчера ВВ
    199. //  Возвращает:  STATUS_XXX
    200. // #define SMALL_VERSION
    201. // В том случае, если не закомментировать верхнюю строчку v будет
    202. // выполнена компиляция версии, в которой будет обрабатываться только
    203. // один тип IOCTL запросов -- IOCTL_MAKE_SYSTEM_CRASH
    204.  
    205. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT fdo, IN PIRP Irp )
    206. {
    207.     NTSTATUS status = STATUS_SUCCESS;
    208.     ULONG BytesTxd =0; // Число переданных/полученных байт (пока 0)
    209.     PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
    210.  
    211.     // Получаем указатель на расширение устройства
    212.     PEXAMPLE_DEVICE_EXTENSION dx =
    213.                  (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension;
    214.     //-------------------------------
    215.     // Выделяем из IRP собственно значение IOCTL кода, по поводу
    216.     // которого случился вызов:
    217.     ULONG ControlCode =
    218.     IrpStack->Parameters.DeviceIoControl.IoControlCode;
    219.     ULONG method = ControlCode & 0x03;
    220.  
    221.     // Получаем текущее значение уровня IRQL v приоритета,
    222.     // на котором выполняется поток (вообще говоря, целое число):
    223.     KIRQL irql,
    224.     currentIrql = KeGetCurrentIrql();
    225.  
    226.     #if DBG
    227.     DbgPrint("-Example- In DeviceControlRoutine (fdo= %X)\n",fdo);
    228.     DbgPrint("-Example- DeviceIoControl: IOCTL %x.", ControlCode );
    229.     if(currentIrql==PASSIVE_LEVEL)
    230.         DbgPrint("-Example- PASSIVE_LEVEL (val=%d)",currentIrql);
    231.     #endif
    232.     // Запрашиваем владение объектом спин-блокировки. В данном
    233.     // примере не выполняется никаких критичных действий, но,
    234.     // вообще говоря, этот прием может быть полезен и даже
    235.     // незаменим, если в приведенном ниже коде должны будут
    236.     // выполнены манипуляции, которые можно делать только
    237.     // эксклюзивно. Пока потоку выделен объект спин-блокировки v
    238.     // никакой другой поток не сможет войти в оператор switch:
    239.     KeAcquireSpinLock(&MySpinLock,&irql);
    240.  
    241.     // Диспетчеризация по IOCTL кодам:
    242.     switch( ControlCode) {
    243.  
    244.     #ifndef SMALL_VERSION
    245.     case IOCTL_PRINT_DEBUG_MESS:
    246.     {     // Только вводим сообщение и только в отладочной версии
    247.         #if DBG
    248.         DbgPrint("-Example- IOCTL_PRINT_DEBUG_MESS.");
    249.         #endif
    250.         break;
    251.     }
    252.     case IOCTL_CHANGE_IRQL:
    253.     {
    254.         #if DBG
    255.         // Эксперименты по искусственному повышению
    256.         // IRQL v только в отладочной версии!
    257.         DbgPrint("-Example- IOCTL_CHANGE_IRQL.");
    258.         KIRQL dl = DISPATCH_LEVEL, // только для распечатки (2)
    259.         oldIrql,
    260.         newIrql=25; // Новый уровень IRQL (например, 25)
    261.         // Устанавливаем newIrql, сохраняя текущий в oldIrql:
    262.         KeRaiseIrql(newIrql,&oldIrql);
    263.         newIrql=KeGetCurrentIrql(); // Что реально получили?
    264.  
    265.         DbgPrint("-Example- DISPATCH_LEVEL value =%d",dl);
    266.         DbgPrint("-Example- IRQLs are old=%d new=%d",
    267.                         oldIrql,newIrql);
    268.         KeLowerIrql(oldIrql); // Возвращаем старое значение
    269.         #endif
    270.         break;
    271.     }
    272.     #endif // SMALL_VERSION
    273.  
    274.  
    275.     case IOCTL_MAKE_SYSTEM_CRASH:
    276.     {
    277.         int errDetected=0;
    278.         char x = (char)0xFF;
    279.  
    280.         #if DBG  // Вообще говоря, под NT мы этого уже не увидим:
    281.         DbgPrint("-Example- IOCTL_MAKE_SYSTEM_CRASH.");
    282.         #endif
    283.         // Вызываем системный сбой обращением по нулевому адресу
    284.         __try {
    285.         x = *(char*)0x0L; // ошибочная ситуация
    286.             //^^^^^^^^^^^^ здесь случится сбой NT, но не Win98
    287.         }
    288.         __except(EXCEPTION_EXECUTE_HANDLER)
    289.         {   // Перехват исключения не работает!
    290.             // Эта занимательная ситуация объяснена в 10.2.6,
    291.             // при рассмотрении объектов спин-блокировок.
    292.             errDetected=1;
    293.         };
    294.         #if DBG
    295.         DbgPrint("-Example- Value of x is %X.",x);
    296.         if(errDetected)
    297.             DbgPrint("-Example- Except detected in Example driver.");
    298.         #endif
    299.         break;
    300.     }
    301.  
    302.     #ifndef SMALL_VERSION
    303.     case IOCTL_TOUCH_PORT_378H:
    304.     {  
    305.         unsigned short ECRegister = 0x378+0x402;
    306.         #if DBG
    307.         DbgPrint("-Example- IOCTL_TOUCH_PORT_378H.");
    308.         #endif
    309.         // Пробуем программно перевести параллельный порт 378,
    310.         // сконфигурированный средствами BIOS как ECP+EPP, в
    311.         // режим EPP.
    312.         _asm  {
    313.             mov dx,ECRegister ;
    314.             xor al,al    ;
    315.             out dx,al    ;    Установить EPP mode 000
    316.             mov al,095h  ;    Биты 7:5 = 100
    317.             out dx,al    ;    Установить EPP mode 100
    318.         }
    319.         // Подобные действия в приложении пользовательского
    320.         // режима под NT  обязательно привело бы к аварийной
    321.         // выгрузке приложения с сообщением об ошибке!
    322.         // Практически эти пять строк демонстрируют, что можно
    323.         // работать с LPT портом под Windows NT !
    324.         break;
    325.     }
    326.  
    327.     case IOCTL_SEND_BYTE_TO_USER:
    328.     {  
    329.         // Размер данных, поступивших от пользователя:
    330.         ULONG InputLength = //только лишь для примера
    331.             IrpStack->Parameters.DeviceIoControl.InputBufferLength;
    332.         // Размер буфера для данных, ожидаемых пользователем
    333.         ULONG OutputLength =
    334.         IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    335.         #if DBG
    336.         DbgPrint("-Example- Buffer outlength %d",OutputLength);
    337.         #endif
    338.  
    339.         if( OutputLength<1 )
    340.         {// Если не предоставлен буфер v завершить IRP с ошибкой
    341.             status = STATUS_INVALID_PARAMETER;
    342.             break;
    343.         }
    344.         UCHAR *buff; // unsigned char, привыкаем к новой нотации
    345.         if(method==METHOD_BUFFERED)
    346.         {
    347.             buff = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
    348.             #if DBG
    349.             DbgPrint("-Example- Method : BUFFERED.");
    350.             #endif
    351.         }
    352.         else
    353.             if (method==METHOD_NEITHER)
    354.             {
    355.                 buff=(unsigned char*)Irp->UserBuffer;
    356.                 #if DBG
    357.                 DbgPrint("-Example- Method : NEITHER.");
    358.                 #endif
    359.             }
    360.             else
    361.             {
    362.                 #if DBG
    363.                 DbgPrint("-Example- Method : unsupported.");
    364.                 #endif
    365.                 status = STATUS_INVALID_DEVICE_REQUEST;
    366.                 break;
    367.             }
    368.         #if DBG
    369.         DbgPrint("-Example- Buffer address is %08X",buff);
    370.         #endif
    371.         *buff=33;     // Любимое число Штирлица
    372.         BytesTxd = 1; // Передали 1 байт
    373.         break;
    374.     }
    375.     #endif // SMALL_VERSION
    376.     // Ошибочный запрос (код IOCTL, который не обрабатывается):
    377.     default: status = STATUS_INVALID_DEVICE_REQUEST;
    378.     }
    379.     // Освобождение спин-блокировки
    380.     KeReleaseSpinLock(&MySpinLock,irql);
    381.  
    382.     #if DBG
    383.     DbgPrint("-Example- DeviceIoControl: %d bytes written.", (int)BytesTxd);
    384.     #endif
    385.  
    386. return CompleteIrp(Irp,status,BytesTxd); // Завершение IRP
    387. }
    388. //
    389. // (Файл init.cpp)
    390. // UnloadRoutine: Выгружает драйвер, освобождая оставшиеся объекты
    391. // Вызывается системой, когда необходимо выгрузить драйвер.
    392. // Как и процедура AddDevice, регистрируется иначе чем
    393. // все остальные рабочие процедуры и не получает никаких IRP.
    394. // Arguments:  указатель на объект драйвера
    395. //
    396.  
    397. #pragma code_seg("PAGE")
    398. // Допускает размещение в странично организованной памяти
    399. //
    400. VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    401. {
    402.     PDEVICE_OBJECT  pNextDevObj;
    403.     int i;
    404.  
    405.     // Задаем печать отладочных сообщений v если сборка отладочная
    406.     #if DBG
    407.     DbgPrint("-Example- In Unload Routine.");
    408.     #endif
    409.     //==========================================================
    410.     // Нижеприведенные  операции в полномасштабном WDM драйвере
    411.     // следовало бы поместить в обработчике IRP_MJ_PNP запросов
    412.     // с субкодом IRP_MN_REMOVE_DEVICE, но в силу простоты
    413.     // драйвера, сделаем это здесь.
    414.     // Проходим по всем объектам устройств, контролируемым
    415.     // драйвером
    416.     pNextDevObj = pDriverObject->DeviceObject;
    417.  
    418.     for(i=0; pNextDevObj!=NULL; i++)
    419.     {
    420.         PEXAMPLE_DEVICE_EXTENSION dx =
    421.                 (PEXAMPLE_DEVICE_EXTENSION)pNextDevObj->DeviceExtension;
    422.         // Удаляем символьную ссылку и уничтожаем FDO:
    423.         UNICODE_STRING *pLinkName = & (dx->ustrSymLinkName);
    424.         // !!! сохраняем указатель:
    425.         pNextDevObj = pNextDevObj->NextDevice;
    426.  
    427.         #if DBG
    428.         DbgPrint("-Example- Deleted device (%d) : pointer to FDO = %X.",
    429.                             i,dx->fdo);
    430.         DbgPrint("-Example- Deleted symlink = %ws.", pLinkName->Buffer);
    431.         #endif
    432.  
    433.         IoDeleteSymbolicLink(pLinkName);
    434.         IoDeleteDevice( dx->fdo);
    435.     }
    436. }
    437. #pragma code_seg() // end PAGE section
    Код (Text):
    1. #ifndef _DRIVER_H_04802_BASHBD_1UIWQ1_8239_1NJKDH832_901_
    2. #define _DRIVER_H_04802_BASHBD_1UIWQ1_8239_1NJKDH832_901_
    3. // Выше приведены две строки (в конце файла имеется еще #endif),
    4. // которые в больших проектах запрещают повторные  проходы по тексту,
    5. // который находится внутри h-файла (что весьма удобно для повышения
    6. // скорости компиляции).
    7. // (Файл Driver.h)
    8.  
    9. #ifdef __cplusplus
    10. extern "C"
    11. {
    12. #endif
    13.  
    14. #include "ntddk.h"
    15.  
    16. //#include "wdm.h"
    17. // ^^^^^^^^^^^^^^ если выбрать эту строку и закомментировать
    18. // предыдущую, то компиляция  в среде DDK (при помощи утилиты Build)
    19. // также пройдет успешно, однако драйвер Example не станет от этого
    20. // настоящим WDM драйвером.
    21.  
    22. #ifdef __cplusplus
    23. }
    24. #endif
    25. // Определяем структуру расширения устройства. Включим в нее
    26. // указатель на FDO (для удобства последующей работы UnloadRoutine) и
    27. // имя символьной ссылки в формате UNOCODE_STRING.
    28.  
    29. typedef struct _EXAMPLE_DEVICE_EXTENSION
    30. {
    31.     PDEVICE_OBJECT  fdo;
    32.     UNICODE_STRING  ustrSymLinkName; // L"\\DosDevices\\Example"
    33. } EXAMPLE_DEVICE_EXTENSION, *PEXAMPLE_DEVICE_EXTENSION;
    34.  
    35. // Определяем собственные коды IOCTL, с которыми можно будет
    36. // обращаться к драйверу при помощи вызова DeviceIoControl.
    37. // Определение макроса CTL_CODE можно найти в файле DDK Winioctl.h.
    38. // Там же можно найти и численные значения, скрывающиеся под именами
    39. // METHOD_BUFFERED и METHOD_NEITHER.
    40.  
    41. // Внимание! Текст приведенный ниже должен войти в файл Ioctl.h,
    42. // который будет необходим для компиляции тестового приложения.
    43. // (Разумеется, за исключением последней строки с "#endif".)
    44.  
    45. #define IOCTL_PRINT_DEBUG_MESS CTL_CODE( \
    46.     FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
    47.  
    48. #define IOCTL_CHANGE_IRQL CTL_CODE(\
    49.     FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
    50.  
    51. #define IOCTL_MAKE_SYSTEM_CRASH CTL_CODE( \
    52.     FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
    53.  
    54. #define IOCTL_TOUCH_PORT_378H CTL_CODE( \
    55.     FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
    56.  
    57. #define IOCTL_SEND_BYTE_TO_USER CTL_CODE( \
    58.     FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
    59.  
    60. // Вариант :
    61. //#define IOCTL_SEND_BYTE_TO_USER CTL_CODE( \
    62. //    FILE_DEVICE_UNKNOWN, 0x805, METHOD_NEITHER, FILE_ANY_ACCESS)
    63. #endif
    # Файл Makefile
    #
    # DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
    # file to this component. This file merely indirects to the real make file
    # that is shared by all the driver components of the Windows NT DDK
    #

    !INCLUDE $(NTMAKEENV)\makefile.def

    --------------------------------------------------------
    # Файл Sources
    TARGETNAME=Example
    TARGETTYPE=DRIVER
    #DRIVERTYPE=WDM
    TARGETPATH=obj
    SOURCES=driver.cpp

    c:\driver>build
    BUILD: Object root set to: ==> objchk
    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:\driver directory for files to compile.
    c:\driver - 1 source files (0 lines)
    BUILD: Saving C:\WINDDK\2600\build.dat...
    BUILD: Compiling c:\driver directory
    1>Compiling - driver.c for i386
    1>driver.c(33) : error C2059: syntax error : 'string'
    1>driver.c(258) : error C2275: 'KIRQL' : illegal use of this type as an expressi
    on
    1>c:\winddk\2600\inc\wxp\ntdef.h(1484) : error see declaration of 'KIRQL'
    1>driver.c(258) : error C2146: syntax error : missing ';' before identifier 'dl'

    1>driver.c(258) : error C2144: syntax error : '<Unknown>' should be preceded by
    '<Unknown>'
    1>driver.c(258) : error C2144: syntax error : '<Unknown>' should be preceded by
    '<Unknown>'
    1>driver.c(258) : error C2143: syntax error : missing ';' before 'identifier'
    1>driver.c(258) : error C2065: 'dl' : undeclared identifier
    1>driver.c(259) : error C2065: 'oldIrql' : undeclared identifier
    1>driver.c(260) : error C2065: 'newIrql' : undeclared identifier
    1>driver.c(262) : error C4242: 'function' : conversion from 'int' to 'KIRQL', po
    ssible loss of data
    1>driver.c(268) : error C4242: 'function' : conversion from 'int' to 'KIRQL', po
    ssible loss of data
    1>driver.c(344) : error C2275: 'UCHAR' : illegal use of this type as an expressi
    on
    1>c:\winddk\2600\inc\wxp\ntdef.h(409) : error see declaration of 'UCHAR'
    1>driver.c(344) : error C2065: 'buff' : undeclared identifier
    1>driver.c(347) : error C4047: '=' : 'int' differs in levels of indirection from
    'PUCHAR'
    1>driver.c(355) : error C4047: '=' : 'int' differs in levels of indirection from
    'unsigned char *'
    1>driver.c(371) : error C2100: illegal indirection
    BUILD: Compile errors: not linking c:\driver directory
    BUILD: Done

    2 files compiled - 18 Errors

    пример опять же из солдатова/

    помогите исходником на си управляемого с помощъю IOCTL просто загружаемогоо и выгружаемого драйвера(и компиляемого пожалуйстааааааа)
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    очень желательно проект для VS
    мне нужно просто работать с портами клавы 0х60 0х64 для эмуляции нажатия оной
    повторюсь в юсермоде ничего не выходить
    обязуюсь научиться писать сам драйвера и впредбь не докапывать с такими глупыми просьбамиёвопросами))
    ПОЖАЛУЙСТО
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    и вчем косяк и мое незнание с++
    Код (Text):
    1. typedef struct _EXAMPLE_DEVICE_EXTENSION
    2. {
    3.     PDEVICE_OBJECT  fdo;
    4.     UNICODE_STRING  ustrSymLinkName;
    5. } EXAMPLE_DEVICE_EXTENSION, *PEXAMPLE_DEVICE_EXTENSION;
    6.  
    7.  
    8.  
    9. PEXAMPLE_DEVICE_EXTENSION dx = (PEXAMPLE_DEVICE_EXTENSION)fdo->DeviceExtension;
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    скомпилил как с++ код в студии:


    Код (Text):
    1. 1>------ Rebuild All started: Project: drv, Configuration: Debug Win32 ------
    2. 1>Deleting intermediate and output files for project 'drv', configuration 'Debug|Win32'
    3. 1>Compiling...
    4. 1>main.c
    5. 1>C:\WINDDK\2600\inc\ddk\wxp\ntdef.h(708) : warning C4201: nonstandard extension used : nameless struct/union
    6. 1>C:\WINDDK\2600\inc\ddk\wxp\ntdef.h(726) : warning C4201: nonstandard extension used : nameless struct/union
    7. 1>C:\WINDDK\2600\inc\ddk\wxp\mce.h(41) : warning C4201: nonstandard extension used : nameless struct/union
    8. 1>C:\WINDDK\2600\inc\ddk\wxp\ntddk.h(1919) : warning C4201: nonstandard extension used : nameless struct/union
    9. 1>C:\WINDDK\2600\inc\ddk\wxp\ntddk.h(14758) : warning C4201: nonstandard extension used : nameless struct/union
    10. 1>C:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16155) : warning C4201: nonstandard extension used : nameless struct/union
    11. 1>C:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16205) : warning C4201: nonstandard extension used : nameless struct/union
    12. 1>C:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16514) : warning C4201: nonstandard extension used : nameless struct/union
    13. 1>.\main.c(38) : warning C4100: 'RegistryPath' : unreferenced formal parameter
    14. 1>.\main.c(151) : warning C4100: 'fdo' : unreferenced formal parameter
    15. 1>.\main.c(169) : warning C4100: 'fdo' : unreferenced formal parameter
    16. 1>.\main.c(171) : warning C4189: 'IrpStack' : local variable is initialized but not referenced
    17. 1>.\main.c(186) : warning C4100: 'fdo' : unreferenced formal parameter
    18. 1>.\main.c(280) : warning C4310: cast truncates constant value
    19. 1>.\main.c(226) : warning C4189: 'currentIrql' : local variable is initialized but not referenced
    20. 1>.\main.c(214) : warning C4189: 'dx' : local variable is initialized but not referenced
    21. 1>.\main.c(332) : warning C4189: 'InputLength' : local variable is initialized but not referenced
    22. 1>Linking...
    23. 1>main.obj : error LNK2019: unresolved external symbol __imp_@KfReleaseSpinLock@8 referenced in function "long __stdcall DeviceControlRoutine(struct _DEVICE_OBJECT *,struct _IRP *)" (?DeviceControlRoutine@@YGJPAU_DEVICE_OBJECT@@PAU_IRP@@@Z)
    24. 1>main.obj : error LNK2019: unresolved external symbol __imp_@KfAcquireSpinLock@4 referenced in function "long __stdcall DeviceControlRoutine(struct _DEVICE_OBJECT *,struct _IRP *)" (?DeviceControlRoutine@@YGJPAU_DEVICE_OBJECT@@PAU_IRP@@@Z)
    25. 1>main.obj : error LNK2019: unresolved external symbol __imp__KeGetCurrentIrql@0 referenced in function "long __stdcall DeviceControlRoutine(struct _DEVICE_OBJECT *,struct _IRP *)" (?DeviceControlRoutine@@YGJPAU_DEVICE_OBJECT@@PAU_IRP@@@Z)
    26. 1>LINK : error LNK2001: unresolved external symbol __load_config_used
    27. 1>D:\Workplace\_Creative\vc2008\drv\Debug\drv.sys : fatal error LNK1120: 4 unresolved externals
    28. 1>Build log was saved at "file://d:\Workplace\_Creative\vc2008\drv\drv\Debug\BuildLog.htm"
    29. 1>drv - 5 error(s), 17 warning(s)
    30. ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
    чего не хватает в либах?
    ntoskrnl есть
     
  12. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    punxer
    в kmdkit есть стабильный и выгружаемый фильтр клавиатуры.
    поработай над ним.
    )
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    wsd исключительно си (

    мне всего лишь нужен работающий пример с поддержкой ioctl
     
  14. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    punxer
    http://piter.com/book.phtml?978591180057
    она есть в сети в электронном виде
    и как правильно заметил n0name