Для получения иллюминатора
Я хочу использовать функцию NtQueryInformationPort ниже в функции DriverEntry, чтобы узнать номер всех прослушиваемых портов. Однако я не знаю, как получить PortHandle, который является первым параметром в NtQueryInformationPort.
Есть ли какой-нибудь способ достать Портхэндла?
/*++
Авторское право (c) корпорация Microsoft. Все права защищены.
Вы можете использовать этот код только в том случае, если согласны с условиями Лицензионного соглашения с исходным кодом ядра Windows Research Kernel (см. License.txt).
Если вы не согласны с условиями, не используйте код.
имя модуля:
lpcquery.с
Абстрактный:
Локальное межпроцессное взаимодействие (LPC) услуги запрос
--*/
#включить "lpcp. h"
#ALLOC_PRAGMA условной
#pragma alloc_text(страница, NtQueryInformationPort)
#endif
Файле ntstatus
NTAPI
NtQueryInformationPort (
__в ручке иллюминатора,
__in PORT_INFORMATION_CLASS PortInformationClass,
__out_bcount(длина) PVOID PortInformation,
_Длина тип ulong тюнинг ,
__out_opt PULONG ReturnLength
)
/*++
Описание Процедуры:
Эта процедура должна использоваться для запроса порта lpc, но в значительной степени
не-а. В настоящее время он может только указать, является ли входной дескриптор для порта
объект.
Аргументы:
PortHandle-предоставляет ручку для запрашиваемого порта
PortInformationClass-указывает запрашиваемый класс информации о типе
для. В настоящее время игнорируется.
PortInformation-предоставляет указатель на буфер для получения
информация. В настоящее время просто прощупывают, а потом игнорируют.
Длина-указывает в байтах размер информационного буфера порта.
ReturnLength - Опционально получает размер информации в байтах
быть возвращенным. В настоящее время просто прощупывают, а потом игнорируют.
значение:
NTSTATUS-соответствующее значение статуса.
--*/
{
KPROCESSOR_MODE PreviousMode;
Информация файле ntstatus ;
PLPCP_PORT_OBJECT PortObject;
PAGED_CODE();
UNREFERENCED_PARAMETER ( PortInformationClass );
//
// При необходимости получить предыдущий режим процессора и выходной аргумент зонда.
//
PreviousMode = KeGetPreviousMode();
if (PreviousMode != KernelMode) {
пробовать {
ProbeForWrite( PortInformation,
Длина,
sizeof( ULONG ));
if (ARGUMENT_PRESENT( ReturnLength )) {
ProbeForWriteUlong( ReturnLength );
}
} except (EXCEPTION_EXECUTE_HANDLER ) {
возвращение( функции getexceptioncode() );
}
}
//
// Если пользователь дал нам дескриптор, то ссылайтесь на объект. И вернуться
// успех, если мы получили хорошую ссылку и ошибку в противном случае.
//
if (ARGUMENT_PRESENT( PortHandle )) {
Status = ObReferenceObjectByHandle( PortHandle,
Помощью generic_read,
LpcPortObjectType,
PreviousMode,
& amp; PortObject,
НУЛЕВОЙ );
if (! NT_SUCCESS( Status )) {
//
// Это может быть ожидаемый объект порта.
// Давайте попробуем еще раз, как этот тип объекта
//
Status = ObReferenceObjectByHandle( PortHandle,
Помощью generic_read,
LpcWaitablePortObjectType,
PreviousMode,
& amp; PortObject,
НУЛЕВОЙ );
//
// Если этот тоже провалится, мы вернем этот статус
//
if (! NT_SUCCESS( Status )) {
возврат (статус );
}
}
ObDereferenceObject( PortObject );
возвращаемое значение status_success;
} еще {
возврат STATUS_INVALID_INFO_CLASS;
}
}
*******
Что я уже пробовал:
------------------------------------------------------