diff options
Diffstat (limited to 'private/ntos/tdi/isn/fwd/registry.c')
-rw-r--r-- | private/ntos/tdi/isn/fwd/registry.c | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/private/ntos/tdi/isn/fwd/registry.c b/private/ntos/tdi/isn/fwd/registry.c new file mode 100644 index 000000000..b38a3b4e1 --- /dev/null +++ b/private/ntos/tdi/isn/fwd/registry.c @@ -0,0 +1,273 @@ +/*******************************************************************/ +/* Copyright(c) 1993 Microsoft Corporation */ +/*******************************************************************/ + +//*** +// +// Filename: registry.c +// +// Description: routines for reading the registry configuration +// +// Author: Stefan Solomon (stefans) November 9, 1993. +// +// Revision History: +// Updated to read parameters of new forwarder driver (11/95) +// +//*** + +#include "precomp.h" + +NTSTATUS +SetIpxDeviceName( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext + ); + +/*++ +******************************************************************* + R e a d I p x D e v i c e N a m e + +Routine Description: + Allocates buffer and reads device name exported by the IPX stack + into it +Arguments: + FileName - pointer to buffer to hold the name +Return Value: + STATUS_SUCCESS - tables were created ok + STATUS_INSUFFICIENT_RESOURCES - resource allocation failed + STATUS_OBJECT_NAME_NOT_FOUND - if name value is not found +******************************************************************* +--*/ +NTSTATUS +ReadIpxDeviceName ( + PWSTR *FileName + ) { + NTSTATUS Status; + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + PWSTR Export = L"Export"; + PWSTR IpxRegistryPath = L"NwLnkIpx\\Linkage"; + + // + // Set up QueryTable to do the following: + // + + // + // 1) Call SetIpxDeviceName for the string in "Export" + // + + QueryTable[0].QueryRoutine = SetIpxDeviceName; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].Name = Export; + QueryTable[0].EntryContext = FileName; + QueryTable[0].DefaultType = 0; + + // + // 2) Stop + // + + QueryTable[1].QueryRoutine = NULL; + QueryTable[1].Flags = 0; + QueryTable[1].Name = NULL; + + Status = RtlQueryRegistryValues( + RTL_REGISTRY_SERVICES, + IpxRegistryPath, + QueryTable, + NULL, + NULL); + + return Status; +} + + +/*++ +******************************************************************* + S e t I p x D e v i c e N a m e + +Routine Description: + This routine is a callback routine for RtlQueryRegistryValues + It is called for each piece of the "Export" multi-string and + saves the information in a ConfigurationInfo structure. +Arguments: + ValueName - The name of the value ("Export" -- ignored). + ValueType - The type of the value (REG_SZ -- ignored). + ValueData - The null-terminated data for the value. + ValueLength - The length of ValueData. + Context - NULL. + EntryContext - file name pointer. +Return Value: + STATUS_SUCCESS - name was allocated and copied OK + STATUS_INSUFFICIENT_RESOURCES - name allocation failed +******************************************************************* +--*/ +NTSTATUS +SetIpxDeviceName( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext + ) { + PWSTR *FileName = (PWSTR *)EntryContext; + + ASSERT (ValueType==REG_SZ); + *FileName = (PWSTR)ExAllocatePoolWithTag(NonPagedPool, + ValueLength, FWD_POOL_TAG); + if (*FileName != NULL) { + RtlCopyMemory (*FileName, ValueData, ValueLength); + return STATUS_SUCCESS; + } + else + return STATUS_INSUFFICIENT_RESOURCES; + +} + +/*++ +******************************************************************* + G e t R o u t e r P a r a m e t e r s + +Routine Description: + Reads the parameters from the registry or sets the defaults +Arguments: + RegistryPath - where to read from. +Return Value: + STATUS_SUCCESS +******************************************************************* +--*/ +NTSTATUS +GetForwarderParameters ( + IN PUNICODE_STRING RegistryPath + ) { + NTSTATUS Status; + PWSTR RegistryPathBuffer; + PWSTR Parameters = L"Parameters"; + RTL_QUERY_REGISTRY_TABLE paramTable[11]; // table size = nr of params + 1 + + RegistryPathBuffer = (PWSTR)ExAllocatePool(NonPagedPool, RegistryPath->Length + sizeof(WCHAR)); + + if (RegistryPathBuffer == NULL) { + return STATUS_INSUFFICIENT_RESOURCES; + } + + RtlCopyMemory (RegistryPathBuffer, RegistryPath->Buffer, RegistryPath->Length); + *(PWCHAR)(((PUCHAR)RegistryPathBuffer)+RegistryPath->Length) = (WCHAR)'\0'; + + RtlZeroMemory(¶mTable[0], sizeof(paramTable)); + + paramTable[0].QueryRoutine = NULL; + paramTable[0].Flags = RTL_QUERY_REGISTRY_SUBKEY; + paramTable[0].Name = Parameters; + + paramTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[1].Name = L"MaxRcvPktPoolSize"; + paramTable[1].EntryContext = &MaxRcvPktsPoolSize; + paramTable[1].DefaultType = REG_DWORD; + paramTable[1].DefaultData = &MaxRcvPktsPoolSize; + paramTable[1].DefaultLength = sizeof(ULONG); + + paramTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[2].Name = L"RcvPktsPerSegment"; + paramTable[2].EntryContext = &RcvPktsPerSegment; + paramTable[2].DefaultType = REG_DWORD; + paramTable[2].DefaultData = &RcvPktsPerSegment; + paramTable[2].DefaultLength = sizeof(ULONG); + + paramTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[3].Name = L"RouteTableSegmentSize"; + paramTable[3].EntryContext = &RouteSegmentSize; + paramTable[3].DefaultType = REG_DWORD; + paramTable[3].DefaultData = &RouteSegmentSize; + paramTable[3].DefaultLength = sizeof(ULONG); + + paramTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[4].Name = L"MaxSendPktsQueued"; + paramTable[4].EntryContext = &MaxSendPktsQueued; + paramTable[4].DefaultType = REG_DWORD; + paramTable[4].DefaultData = &MaxSendPktsQueued; + paramTable[4].DefaultLength = sizeof(ULONG); + + paramTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[5].Name = L"ClientHashSize"; + paramTable[5].EntryContext = &ClientHashSize; + paramTable[5].DefaultType = REG_DWORD; + paramTable[5].DefaultData = &ClientHashSize; + paramTable[5].DefaultLength = sizeof(ULONG); + + paramTable[6].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[6].Name = L"InterfaceHashSize"; + paramTable[6].EntryContext = &InterfaceHashSize; + paramTable[6].DefaultType = REG_DWORD; + paramTable[6].DefaultData = &InterfaceHashSize; + paramTable[6].DefaultLength = sizeof(ULONG); + + paramTable[7].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[7].Name = L"MaxNetbiosPacketsQueued"; + paramTable[7].EntryContext = &MaxNetbiosPacketsQueued; + paramTable[7].DefaultType = REG_DWORD; + paramTable[7].DefaultData = &MaxNetbiosPacketsQueued; + paramTable[7].DefaultLength = sizeof(ULONG); + + paramTable[8].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[8].Name = L"SpoofingTimeout"; + paramTable[8].EntryContext = &SpoofingTimeout; + paramTable[8].DefaultType = REG_DWORD; + paramTable[8].DefaultData = &SpoofingTimeout; + paramTable[8].DefaultLength = sizeof(ULONG); + + paramTable[9].Flags = RTL_QUERY_REGISTRY_DIRECT; + paramTable[9].Name = L"DontSuppressNonAgentSapAdvertisements"; + paramTable[9].EntryContext = &DontSuppressNonAgentSapAdvertisements; + paramTable[9].DefaultType = REG_DWORD; + paramTable[9].DefaultData = &DontSuppressNonAgentSapAdvertisements; + paramTable[9].DefaultLength = sizeof(ULONG); + + Status = RtlQueryRegistryValues( + RTL_REGISTRY_ABSOLUTE, + RegistryPathBuffer, + paramTable, + NULL, + NULL); + + if(!NT_SUCCESS(Status)) { + + IpxFwdDbgPrint (DBG_REGISTRY, DBG_WARNING, + ("IpxFwd: Missing Parameters key in the registry\n")); + } + + ExFreePool(RegistryPathBuffer); + + if ((RcvPktsPerSegment > MAX_RCV_PKTS_PER_SEGMENT) || + (RcvPktsPerSegment < MIN_RCV_PKTS_PER_SEGMENT)) { + + RcvPktsPerSegment = DEF_RCV_PKTS_PER_SEGMENT; + } + + if ((RouteSegmentSize > MAX_ROUTE_SEGMENT_SIZE) || + (RouteSegmentSize < MIN_ROUTE_SEGMENT_SIZE)) { + + RouteSegmentSize = DEF_ROUTE_SEGMENT_SIZE; + } + else + RouteSegmentSize = ROUND_TO_PAGES(RouteSegmentSize); + + if ((InterfaceHashSize > MAX_INTERFACE_HASH_SIZE) || + (InterfaceHashSize < MIN_INTERFACE_HASH_SIZE)) { + + InterfaceHashSize = DEF_INTERFACE_HASH_SIZE; + } + + if ((ClientHashSize > MAX_CLIENT_HASH_SIZE) || + (ClientHashSize < MIN_CLIENT_HASH_SIZE)) { + + ClientHashSize = DEF_CLIENT_HASH_SIZE; + } + // even if the RtlQueryRegistryValues has failed, we return success and will + // use the defaults. + return STATUS_SUCCESS; +} + |