|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 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 (статус: Посетитель), 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
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|