Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 653

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Вопрос касается взаимодействия с sys файлами (если конкретнее вызов API функций, хранимых в них), которые как я понимаю являются частью ядра. Делов том что мне необходимо вызвать API функцию, для которой в программах на C нужно добавить заголовочный файл Portcls.h из Windows Driver Development Kit, про его эквиваленты в delphi я ничего не слышал, но в папке Windows\drivers\ есть файл Portcls.sys, в котором я думаю и хранятся нужные функции.

Если вы знаете как можно вызвать API функцию из этого файла пожалуйста покажите простенький пример типа такого для DLL

SomeFunc(param1:WORD; param2:WORD): BOOLEAN; External;
STDCall "SomeDLL" name "SomeFunc";

SOA Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 13 октября 2010, 19:46
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 14 октября 2010, 11:05; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 14 октября 2010, 10:12 [#1]:

Логичный вопрос - а зачем?
Я так подозреваю, хочется поуправлять портами ввода-вывода. Дело в том, что sys файлы не являются dll и так просто экспортировать функции с них нельзя. Они не являются даже PE файлами, а обычно это NE или LE файлы (другой формат файла).
Но делфовский линковщик не может связать с таким файлом (было бы удивительно, если бы мог - другие тоже не могут).

Но на самом деле, если нужно поуправлять портами, то есть более простой способ, почитайте тут http://citforum.ru/operating_systems/windows/parp_win/
Галочка "подтверждения прочтения" - вселенское зло.
SOA

SOA (статус: Посетитель), 14 октября 2010, 11:05 [#2]:

Нет портами я управлять не хочу.
Вопрос скорее является продолжением вопроса про DMA контроллер, там вы писали, что в windows буфер для DMA предусмотрен (не дословно конечно, но смысл такой), посмотрев на MSDN увидил API AllocateBuffer и FreeBuffer, которые как раз и создают/освобождают буфер для DMA контроллера, но для их использования нет DLL, а нужно включать заголовочный файл Portcls.h из DDK, собственно почему и спрашиваю как можно обратиться к функциям Portcls.sys.
Также подумываю а не попробывать ли самому переписать нужную часть Portcls.h на delphi, но тут не хватает знаний в области C

Вот как я понимаю тот кусок кода, который нужен
#if !defined(DEFINE_ABSTRACT_DMACHANNEL)
 
#define DEFINE_ABSTRACT_DMACHANNEL()                            \
    STDMETHOD_(NTSTATUS,AllocateBuffer)                         \
    (   THIS_                                                   \
        __in      ULONG               BufferSize,               \
        __in_opt  PPHYSICAL_ADDRESS   PhysicalAddressConstraint \
    )   PURE;                                                   \
    STDMETHOD_(void,FreeBuffer)                                 \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(ULONG,TransferCount)                             \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(ULONG,MaximumBufferSize)                         \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(ULONG,AllocatedBufferSize)                       \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(ULONG,BufferSize)                                \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(void,SetBufferSize)                              \
    (   THIS_                                                   \
        __in      ULONG   BufferSize                            \
    )   PURE;                                                   \
    STDMETHOD_(PVOID,SystemAddress)                             \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(PHYSICAL_ADDRESS,PhysicalAddress)                \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(PADAPTER_OBJECT,GetAdapterObject)                \
    (   THIS                                                    \
    )   PURE;                                                   \
    STDMETHOD_(void,CopyTo)                                     \
    (   THIS_                                                   \
        __inout_bcount(ByteCount)   PVOID   Destination,        \
        __in                        PVOID   Source,             \
        __in                        ULONG   ByteCount           \
    )   PURE;                                                   \
    STDMETHOD_(void,CopyFrom)                                   \
    (   THIS_                                                   \
        __inout_bcount(ByteCount)   PVOID   Destination,        \
        __in                        PVOID   Source,             \
        __in                        ULONG   ByteCount           \
    )   PURE;
 
#endif //!defined(DEFINE_ABSTRACT_DMACHANNEL)

вот то что примерно должно получиться в delphi
{$if not(defined(DEFINE_ABSTRACT_DMACHANNEL))}
 
{$define DEFINE_ABSTRACT_DMACHANNEL()
   // Проблемы начинаются тут, потому что эквивалентов
   // STDMETHOD_ , THIS_ , __in , __in_opt, PURE
   // я в delphi не знаю
   STDMETHOD_(NTSTATUS,AllocateBuffer)
    (   THIS_
        __in      ULONG               BufferSize,
        __in_opt  PPHYSICAL_ADDRESS   PhysicalAddressConstraint
    )   PURE;  
 
}
{$endif }

Также была надежда на директиву
$HPPEMIT
но строка
(*$HPPEMIT '#include <Portcls.h>' *)
ничего не дает :(

Если что то файл Portcls.h можно посмотреть по следующей ссылке

http://www.koders.com/c/fidAC3AD350E7899EA15B4A769768BC3E87E75A1EB8.aspx

Функция AllocateBuffer описывается здесь

http://msdn.microsoft.com/en-us/library/ff536553(v=VS.85).aspx

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 27 марта 2023, 10:33
Выполнено за 0.03 сек.
Рейтинг@Mail.ru