windows-nt/Source/XPSP1/NT/base/ntos/lpc/lpcquery.c

148 lines
3.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
lpcquery.c
Abstract:
Local Inter-Process Communication (LPC) query services
Author:
Steve Wood (stevewo) 15-May-1989
Revision History:
--*/
#include "lpcp.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE,NtQueryInformationPort)
#endif
NTSTATUS
NTAPI
NtQueryInformationPort (
IN HANDLE PortHandle OPTIONAL,
IN PORT_INFORMATION_CLASS PortInformationClass,
OUT PVOID PortInformation,
IN ULONG Length,
OUT PULONG ReturnLength OPTIONAL
)
/*++
Routine Description:
This routine should be used to query an lpc port, but is pretty much a
noop. Currently it can only indicate if the input handle is for a port
object.
Arguments:
PortHandle - Supplies the handle for the port being queried
PortInformationClass - Specifies the type information class being asked
for. Currently ignored.
PortInformation - Supplies a pointer to the buffer to receive the
information. Currently just probed and then ignored.
Length - Specifies, in bytes, the size of the port information buffer.
ReturnLength - Optionally receives the size, in bytes, of the information
being returned. Currently just probed and then ignored.
Return Value:
NTSTATUS - An appropriate status value.
--*/
{
KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
PLPCP_PORT_OBJECT PortObject;
PAGED_CODE();
UNREFERENCED_PARAMETER ( PortInformationClass );
//
// Get previous processor mode and probe output argument if necessary.
//
PreviousMode = KeGetPreviousMode();
if (PreviousMode != KernelMode) {
try {
ProbeForWrite( PortInformation,
Length,
sizeof( ULONG ));
if (ARGUMENT_PRESENT( ReturnLength )) {
ProbeForWriteUlong( ReturnLength );
}
} except( EXCEPTION_EXECUTE_HANDLER ) {
return( GetExceptionCode() );
}
}
//
// If the user gave us a handle then reference the object. And return
// success if we got a good reference and an error otherwise.
//
if (ARGUMENT_PRESENT( PortHandle )) {
Status = ObReferenceObjectByHandle( PortHandle,
GENERIC_READ,
LpcPortObjectType,
PreviousMode,
&PortObject,
NULL );
if (!NT_SUCCESS( Status )) {
//
// It might be a waitable port object.
// Let's try again as this object type
//
Status = ObReferenceObjectByHandle( PortHandle,
GENERIC_READ,
LpcWaitablePortObjectType,
PreviousMode,
&PortObject,
NULL );
//
// If this one fails too we'll return that status
//
if (!NT_SUCCESS( Status )) {
return( Status );
}
}
ObDereferenceObject( PortObject );
return STATUS_SUCCESS;
} else {
return STATUS_INVALID_INFO_CLASS;
}
}