windows-nt/Source/XPSP1/NT/base/cluster/clusnet/xport/cxinfo.c
2020-09-26 16:20:57 +08:00

177 lines
4.4 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
cxinfo.c
Abstract:
TDI Set/Query Information routines.
Author:
Mike Massa (mikemas) February 20, 1997
Revision History:
Who When What
-------- -------- ----------------------------------------------
mikemas 02-20-97 created
Notes:
--*/
#include "precomp.h"
#pragma hdrstop
#include "cxinfo.tmh"
#ifdef ALLOC_PRAGMA
#endif // ALLOC_PRAGMA
#if 0
#define CDP_SERVICE_FLAGS (TDI_SERVICE_CONNECTIONLESS_MODE | \
TDI_SERVICE_BROADCAST_SUPPORTED)
#else // 0
#define CDP_SERVICE_FLAGS (TDI_SERVICE_CONNECTIONLESS_MODE)
#endif // 0
NTSTATUS
CxQueryInformation(
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp
)
{
NTSTATUS status = STATUS_SUCCESS;
PCN_FSCONTEXT fsContext;
PCX_ADDROBJ addrObj;
CN_IRQL irql;
PTDI_REQUEST_KERNEL_QUERY_INFORMATION queryInformation;
ULONG fileType;
ULONG infoSize;
PVOID infoBuffer;
union {
TDI_PROVIDER_INFO ProviderInfo;
TDI_ADDRESS_INFO AddressInfo;
struct {
TDI_ADDRESS_INFO AddressInfo;
TDI_ADDRESS_CLUSTER ClusterAddress;
} DummyAddressInfo;
} info;
fsContext = (PCN_FSCONTEXT) IrpSp->FileObject->FsContext;
fileType = PtrToUlong(IrpSp->FileObject->FsContext2);
queryInformation = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)
&(IrpSp->Parameters);
IF_CNDBG(CN_DEBUG_INFO) {
CNPRINT((
"[Clusnet] TDI query info type %u\n",
queryInformation->QueryType
));
}
switch(queryInformation->QueryType) {
case TDI_QUERY_BROADCAST_ADDRESS:
CnAssert(fileType == TDI_CONTROL_CHANNEL_FILE);
status = STATUS_NOT_IMPLEMENTED;
break;
case TDI_QUERY_PROVIDER_INFO:
CnAssert(fileType == TDI_CONTROL_CHANNEL_FILE);
infoSize = sizeof(info.ProviderInfo);
infoBuffer = &(info.ProviderInfo);
info.ProviderInfo.Version = 0x0100;
info.ProviderInfo.MaxSendSize = 0;
info.ProviderInfo.MaxConnectionUserData = 0;
info.ProviderInfo.MaxDatagramSize =
CDP_MAX_SEND_SIZE(CX_SIGNATURE_LENGTH);
info.ProviderInfo.ServiceFlags = CDP_SERVICE_FLAGS;
info.ProviderInfo.MinimumLookaheadData = 1;
info.ProviderInfo.MaximumLookaheadData = 0xFFFFF;
info.ProviderInfo.NumberOfResources = 0;
info.ProviderInfo.StartTime.QuadPart = 0;
break;
case TDI_QUERY_PROVIDER_STATISTICS:
CnAssert(fileType == TDI_CONTROL_CHANNEL_FILE);
status = STATUS_NOT_IMPLEMENTED;
break;
case TDI_QUERY_ADDRESS_INFO:
if (fileType == TDI_TRANSPORT_ADDRESS_FILE) {
infoSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address) +
sizeof(TA_CLUSTER_ADDRESS);
infoBuffer = &(info.AddressInfo);
addrObj = (PCX_ADDROBJ) fsContext;
//
// Since no one knows what the activity count means, we'll just set
// it to 1.
//
info.AddressInfo.ActivityCount = 1;
CnAcquireLock(&(addrObj->Lock), &irql);
CxBuildTdiAddress(
&(info.AddressInfo.Address),
CnLocalNodeId,
addrObj->LocalPort,
FALSE
);
CnReleaseLock(&(addrObj->Lock), irql);
}
else {
status = STATUS_INVALID_DEVICE_REQUEST;
}
break;
default:
status = STATUS_INVALID_PARAMETER;
break;
}
if (status == STATUS_SUCCESS) {
PULONG pnBytes = &((ULONG)(Irp->IoStatus.Information));
status = TdiCopyBufferToMdl(
infoBuffer,
0,
infoSize,
Irp->MdlAddress,
0,
pnBytes
);
}
IF_CNDBG(CN_DEBUG_INFO) {
CNPRINT((
"[Clusnet] TDI query info returning status %lx, %u bytes\n",
status,
(ULONG)(Irp->IoStatus.Information)
));
}
return(status);
} // CxQueryInformation