Я только недавно начал программировать в режиме ядра, поэтому мой вопрос может показаться нескольоко некорректным.
Есть устройство не PnP, которое подключается к разным шинам(например LPT и COM). Чтобы определить есть оно или нет нужно послать определенную последовательность символов. Я открываю устройство (COM или LPT) с помощью ZwCreateFile, далее записываю нужную последовательность символов с помощью ZwWriteFile(), но СOM порт нужно настроить на нужные Baud rate, четность, и длину слова.
Здравствуйте, ArtSh, Вы писали:
AS>Я только недавно начал программировать в режиме ядра, поэтому мой вопрос может показаться нескольоко некорректным.
AS>Есть устройство не PnP, которое подключается к разным шинам(например LPT и COM). Чтобы определить есть оно или нет нужно послать определенную последовательность символов. Я открываю устройство (COM или LPT) с помощью ZwCreateFile, далее записываю нужную последовательность символов с помощью ZwWriteFile(), но СOM порт нужно настроить на нужные Baud rate, четность, и длину слова.
AS>Как это сделать?
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
);
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 );
Здравствуйте, ArtSh, Вы писали:
AS>Здравствуйте, TarasCo, Вы писали:
AS>Эта функция описана НЕ в DDK, а в Platform SDK, хотя в библиотеках она есть, как же её использовать в режиме ядра? AS>И в чем отличие от функции ZwDeviceIoControlFile, которая не описана нигде, хотя в библиотеках она тоже есть?
А>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...) что делать?
Здравствуйте, 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"