Summary: | Не работают LPT-ключи Sentinel | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Александр Морозов <amorozov> |
Component: | Ключи защиты ; Системы защиты ; Файл лицензии | Assignee: | Александр Морозов <amorozov> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | minor | ||
Priority: | P3 | CC: | kondratyuk, lav, vitperov |
Version: | 1.0.9 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 42 | ||
Attachments: |
Информация о первом ключе
Информация о втором ключе |
Description
Александр Морозов
2008-11-26 18:24:57 MSK
Created attachment 929 [details]
Информация о первом ключе
Created attachment 930 [details]
Информация о втором ключе
Драйвер ключа sentinel.sys падает во время выполнения DriverEntry из-за вызова нереализованной функции IoQueryDeviceDescription (http://msdn.microsoft.com/en-us/library/aa490868.aspx). Если модифицировать IoGetDeviceObjectPointer, чтобы возвращалось STATUS_SUCCESS, и IoBuildDeviceIoControlRequest, чтобы она ничего не делала и просто возвращала ненулевой указатель, то при загрузке драйвера получаем: fixme:ntoskrnl:IoGetDeviceObjectPointer stub: L"\\Device\\ParallelPort0" 80 0x842db4fc 0x842db4f8 fixme:ntoskrnl:ObfDereferenceObject stub: 0x842db8e4 trace:ntoskrnl:ExAllocatePoolWithTag 244 pool 1 -> 0x81011c20 trace:ntoskrnl:KeInitializeEvent 0x842db48c 0 0 trace:ntoskrnl:IoBuildDeviceIoControlRequest 160030, (nil), (nil), 0, 0x842db4b4, 32, 1, 0x842db48c, 0x842db484 trace:ntoskrnl:__regs_IofCallDriver (nil) 0x12121212 wine: Unhandled page fault on write access to 0x12121235 at address 0x84a886fc (thread 001b), starting debugger... 160030 - это IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO (http://msdn.microsoft.com/en-us/library/ms799485.aspx). Модифицировал функцию IoGetDeviceObjectPointer так, чтобы она создавала новое устройство и возвращала указатель на него, если первый параметр \Device\ParallelPort0. Добавил несколько стабов. Исправил ObfDereferenceObject. Добавил ещё несколько стабов. Драйвер не падает. DriverEntry (функция драйвера, вызываемая при его инициализации) возвращает ошибку STATUS_NO_SUCH_DEVICE. Внесены изменения в функции IoBuildDeviceIoControlRequest, IofCompleteRequest, IofCallDriver и process_ioctl. Написан дополнительный тест для IoBuildDeviceIoControlRequest. Написан тест для IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO. Добавлена функция wine_complete_request, аналог IofCompleteRequest с конвенцией вызова cdecl. Вызовы IofCompleteRequest в wineusbhub заменены на вызовы wine_complete_request. Изменены обработчики IOCTL в mountmgr так, чтобы перед возвратом из них происходил вызов wine_complete_request. Написан тест для функции IoQueryDeviceDescription. Добавил стаб для KeStallExecutionProcessor. Написал тест для IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO. Написал тестовую программу (под Linux), открывающую порт с помощью ieee1284_open. На atlant с LPT-ключом порты открываются, если пользователь root, иначе в логе strace ошибки при выполнении ioperm(0x378, 0x3, 0x1) и при открытии /dev/port. ieee1284_get_deviceid завершается под пользователем из группы lp с ошибкой -7 (Error initialising port), под root при первом вызове -8 (Error interfacing system), при последующих -10 (Invalid port). Вывод тестовой программы из libieee1284-0.2.10: # ./test Found 3 ports: 0x278: 0x378: 0x3bc: 0x278: inaccessible 0x378: inaccessible 0x3bc: inaccessible ./test выполнялась под root Описанные выше проблемы с библиотекой libieee1284 исчезают при использовании версии 0.2.11. Реализовал чтение/запись для регистров data, dsr (только чтение) и dcr (с некоторой оговоркой, см. NOTE в ieee1284.h) параллельного порта с помощью libieee1284. DriverEntry завершается успешно. Переделал функцию IoGetDeviceObjectPointer так, что она теперь работает для всех устройств, а не только для \Device\ParallelPort0. Перенёс создание устройства \Device\ParallelPort0 в новый модуль parport.sys. Добавил в configure.ac проверки на наличие libieee1284. Теперь parport.sys создаёт различное количество устройств \Device\ParallelPort* в зависимости от того, сколько присутствует параллельных портов на машине, на которой запускается wine. Сделал хак, позволяющий вызывать обработчик IRP_MJ_READ драйвера. Обработчик падает. Падение обработчика было вызвано вызовом функций, указатели на которые должны были возвращаться в ответ на IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO. Теперь возвращаются указатели на стабы. Реализовал KeStallExecutionProcessor с помощью nanosleep. Сейчас драйвер не падает, но chkey32w.exe ключ не видит. Обработчик IRP_MJ_READ всегда возвращает STATUS_SUCCESS. Часть битов в регистрах dsr и dcr на PC инвертированы по отношению к тем же битам на других платформах. Функции из libieee1284 реализованы так, что принимают и возвращает значения регистров "как на других платформах". А нам нужны регистры "как на PC", поэтому надо инвертировать часть битов перед записью и после чтения. После внесения исправлений chkey32w.exe ключ видит. Отправил в рассылку патчи: ntoskrnl.exe: Add stub for IoQueryDeviceDescription. hal: Add stub for HalTranslateBusAddress. ntoskrnl.exe: Add stub for KeInitializeSemaphore. hal: Add stubs for {READ,WRITE}_PORT_UCHAR. ntoskrnl.exe: Add semi-stub implementation of Io{Allocate,Write}ErrorLogEntry. include: Add ddk/parallel.h. hal: Add stub for KeStallExecutionProcessor. ntoskrnl.exe: Partially implement IoGetDeviceObjectPointer. Add parport.sys. Re-generate some files. parport.sys: Add fixmes. parport.sys: Add parallel port callback routines. ntoskrnl.exe: Add stub for KeReleaseSemaphore. hal: Implement KeStallExecutionProcessor. ntoskrnl.exe: Add stub for MmMapLockedPagesSpecifyCache. parport.sys: Add DriverUnload routine. ntoskrnl.exe: Implement MmMapLockedPagesSpecifyCache. Add implementation of IRP_MJ_READ handling. hal: Partially implement HalTranslateBusAddress. parport.sys: Implement PPARALLEL_{TRY_ALLOCATE,FREE}_ROUTINE callbacks. Implement {READ,WRITE}_PORT_UCHAR for parallel port registers. Патч: commit 8ea3cd2639fe268f6eab688648420bcee75ea21b Author: Alexander Morozov <amorozov@etersoft.ru> Date: Wed Jan 28 21:10:12 2009 +0300 ntoskrnl.exe: Add stub for MmMapLockedPagesSpecifyCache. Заменил наш код: typedef enum _MEMORY_CACHING_TYPE { MmNonCached = FALSE, MmCached = TRUE, MmWriteCombined = MmFrameBufferCached, MmHardwareCoherentCached, MmCachingTypeDoNotUse1, MmCachingTypeDoNotUse2, MmMaximumCacheType } MEMORY_CACHING_TYPE; на версию из pure: typedef enum _MEMORY_CACHING_TYPE { MmNonCached = 0, MmCached = 1, MmWriteCombined = 2, MmHardwareCoherentCached = 3, MmNonCachedUnordered = 4, MmUSWCCached = 5, MmMaximumCacheType = 6 } MEMORY_CACHING_TYPE; Небольшая разница есть, возможно возникнут проблемы |