IOCTL драйвер вне стека
От: ArtSh Россия  
Дата: 27.09.04 07:09
Оценка:
Я только недавно начал программировать в режиме ядра, поэтому мой вопрос может показаться нескольоко некорректным.

Есть устройство не PnP, которое подключается к разным шинам(например LPT и COM). Чтобы определить есть оно или нет нужно послать определенную последовательность символов. Я открываю устройство (COM или LPT) с помощью ZwCreateFile, далее записываю нужную последовательность символов с помощью ZwWriteFile(), но СOM порт нужно настроить на нужные Baud rate, четность, и длину слова.

Как это сделать?
Re: IOCTL драйвер вне стека
От: TarasCo  
Дата: 27.09.04 09:17
Оценка:
Здравствуйте, ArtSh, Вы писали:

AS>Я только недавно начал программировать в режиме ядра, поэтому мой вопрос может показаться нескольоко некорректным.


AS>Есть устройство не PnP, которое подключается к разным шинам(например LPT и COM). Чтобы определить есть оно или нет нужно послать определенную последовательность символов. Я открываю устройство (COM или LPT) с помощью ZwCreateFile, далее записываю нужную последовательность символов с помощью ZwWriteFile(), но СOM порт нужно настроить на нужные Baud rate, четность, и длину слова.


AS>Как это сделать?


IOCTL_SERIAL_SET_BAUD_RATE
IOCTL_SERIAL_SET_LINE_CONTROL

NTSTATUS
NtDeviceIoControlFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength
);
Да пребудет с тобою сила
Re[2]: IOCTL драйвер вне стека
От: ArtSh Россия  
Дата: 04.10.04 06:27
Оценка:
Здравствуйте, TarasCo, Вы писали:


TC>IOCTL_SERIAL_SET_BAUD_RATE

TC>IOCTL_SERIAL_SET_LINE_CONTROL

TC>NTSTATUS

TC>NtDeviceIoControlFile(
TC> IN HANDLE FileHandle,
TC> IN HANDLE Event OPTIONAL,
TC> IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
TC> IN PVOID ApcContext OPTIONAL,
TC> OUT PIO_STATUS_BLOCK IoStatusBlock,
TC> IN ULONG IoControlCode,
TC> IN PVOID InputBuffer OPTIONAL,
TC> IN ULONG InputBufferLength,
TC> OUT PVOID OutputBuffer OPTIONAL,
TC> IN ULONG OutputBufferLength
TC> );

Эта функция описана НЕ в DDK, а в Platform SDK, хотя в библиотеках она есть, как же её использовать в режиме ядра?
И в чем отличие от функции ZwDeviceIoControlFile, которая не описана нигде, хотя в библиотеках она тоже есть?
Re[3]: IOCTL драйвер вне стека
От: Аноним  
Дата: 04.10.04 06:39
Оценка:
Здравствуйте, ArtSh, Вы писали:

AS>Здравствуйте, TarasCo, Вы писали:



TC>>IOCTL_SERIAL_SET_BAUD_RATE

TC>>IOCTL_SERIAL_SET_LINE_CONTROL

TC>>NTSTATUS

TC>>NtDeviceIoControlFile(
TC>> IN HANDLE FileHandle,
TC>> IN HANDLE Event OPTIONAL,
TC>> IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
TC>> IN PVOID ApcContext OPTIONAL,
TC>> OUT PIO_STATUS_BLOCK IoStatusBlock,
TC>> IN ULONG IoControlCode,
TC>> IN PVOID InputBuffer OPTIONAL,
TC>> IN ULONG InputBufferLength,
TC>> OUT PVOID OutputBuffer OPTIONAL,
TC>> IN ULONG OutputBufferLength
TC>> );

AS>Эта функция описана НЕ в DDK, а в Platform SDK, хотя в библиотеках она есть, как же её использовать в режиме ядра?

AS>И в чем отличие от функции ZwDeviceIoControlFile, которая не описана нигде, хотя в библиотеках она тоже есть?

NtDeviceIoControlFile — это экспорт ядра (если не верите — посмортите в таблицу экспортов ntoskrn.exe), ZwDeviceIoControlFile просто псевдоним той же функции, две разных строчки в таблице экспорта ссылаются на одну и туже функцию. Такчто без разницы Zw... или Nt.... нет никакой.

То, что вы видели в SDK — это экспорт ntdll.dll, предназначенный для вызова через шлюз соответствующей функции режима ядра. Библиотеки пользовательского режима Вам не нужны. Если у Вас есть DDK, в нем есть библиотеки экспорта ядра, но нет заголовочных файлов с объявлениями недокументированных функций. Просто объявите ее сами. Например так:

NTSYSAPI
NTSTATUS
NTAPI
NtDeviceIoControlFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength );
Re[3]: NT vs Zw - Clearing Confusion On The
От: unintruder  
Дата: 06.10.04 04:58
Оценка:
Здравствуйте, ArtSh, Вы писали:

AS>Здравствуйте, TarasCo, Вы писали:


AS>Эта функция описана НЕ в DDK, а в Platform SDK, хотя в библиотеках она есть, как же её использовать в режиме ядра?

AS>И в чем отличие от функции ZwDeviceIoControlFile, которая не описана нигде, хотя в библиотеках она тоже есть?

Здесь понравилось

http://www.osronline.com/article.cfm?article=257
Re[4]: IOCTL драйвер вне стека
От: ArtSh Россия  
Дата: 08.10.04 11:29
Оценка:
Здравствуйте, Аноним, Вы писали:


А>NTSYSAPI

А>NTSTATUS
А>NTAPI
А>NtDeviceIoControlFile(
А> IN HANDLE FileHandle,
А> IN HANDLE Event OPTIONAL,
А> IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
А> IN PVOID ApcContext OPTIONAL,
А> OUT PIO_STATUS_BLOCK IoStatusBlock,
А> IN ULONG IoControlCode,
А> IN PVOID InputBuffer OPTIONAL,
А> IN ULONG InputBufferLength,
А> OUT PVOID OutputBuffer OPTIONAL,
А> IN ULONG OutputBufferLength );


После такого объявления, линкер ищет функцию(__imp_?NtDevice...), а в библиотеке есть (__imp__NtDevice...) что делать?
Re[5]: IOCTL драйвер вне стека
От: TarasCo  
Дата: 08.10.04 12:23
Оценка:
Здравствуйте, ArtSh, Вы писали:

AS>Здравствуйте, Аноним, Вы писали:



А>>NTSYSAPI

А>>NTSTATUS
А>>NTAPI
А>>NtDeviceIoControlFile(
А>> IN HANDLE FileHandle,
А>> IN HANDLE Event OPTIONAL,
А>> IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
А>> IN PVOID ApcContext OPTIONAL,
А>> OUT PIO_STATUS_BLOCK IoStatusBlock,
А>> IN ULONG IoControlCode,
А>> IN PVOID InputBuffer OPTIONAL,
А>> IN ULONG InputBufferLength,
А>> OUT PVOID OutputBuffer OPTIONAL,
А>> IN ULONG OutputBufferLength );


AS>После такого объявления, линкер ищет функцию(__imp_?NtDevice...), а в библиотеке есть (__imp__NtDevice...) что делать?



это потому что Вы на гадском С++ пишите , если так хочется тогда извольтес: extern "C"

я обычно переобъявляю так:

#ifdef __cplusplus
#define EXTERNC extern"C"
#else
#define EXTERNC
#endif


и пишу EXTERNC

или можно еще сишные заголовки так подключать:

extern "C" {
#include <ndis.h> //для примера
}

или самое простое решение: переименуйте свой модкль в *.с
Да пребудет с тобою сила
Re[6]: IOCTL драйвер вне стека
От: ArtSh Россия  
Дата: 15.10.04 17:01
Оценка:
TarasCo! огромное Вам спасибо. Все работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.