148 lines
3.4 KiB
C
148 lines
3.4 KiB
C
/*++
|
||
|
||
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;
|
||
}
|
||
}
|