You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
4.1 KiB
209 lines
4.1 KiB
/*++
|
|
|
|
Copyright (c) 1997-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
NsInit.c
|
|
|
|
Abstract:
|
|
|
|
IpSec NAT shim initialization and shutdown routines
|
|
|
|
Author:
|
|
|
|
Jonathan Burstein (jonburs) 11-July-2001
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
//
|
|
// Global Variables
|
|
//
|
|
|
|
PDEVICE_OBJECT NsIpSecDeviceObject;
|
|
|
|
#if DBG
|
|
ULONG NsTraceClassesEnabled;
|
|
WCHAR NsTraceClassesRegistryPath[] =
|
|
L"MACHINE\\System\\CurrentControlSet\\Services\\IpNat\\Parameters";
|
|
WCHAR NsTraceClassesEnabledName[] =
|
|
L"NatShimTraceClassesEnabled";
|
|
#endif
|
|
|
|
|
|
NTSTATUS
|
|
NsCleanupShim(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is invoked to shutdown the shim.
|
|
|
|
Arguments:
|
|
|
|
none.
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS.
|
|
|
|
Environment:
|
|
|
|
Must be called at PASSIVE_LEVEL.
|
|
|
|
--*/
|
|
|
|
{
|
|
CALLTRACE(("NsCleanupShim\n"));
|
|
|
|
NsShutdownTimerManagement();
|
|
NsShutdownIcmpManagement();
|
|
NsShutdownPacketManagement();
|
|
NsShutdownConnectionManagement();
|
|
|
|
NsIpSecDeviceObject = NULL;
|
|
|
|
return STATUS_SUCCESS;
|
|
} // NsCleanupShim
|
|
|
|
|
|
NTSTATUS
|
|
NsInitializeShim(
|
|
PDEVICE_OBJECT pIpSecDeviceObject,
|
|
PIPSEC_NATSHIM_FUNCTIONS pShimFunctions
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine is invoked to initialize the shim.
|
|
|
|
Arguments:
|
|
|
|
pIpSecDeviceObject - a pointer to the IpSec device object
|
|
|
|
pShimFunctions - a pointer to an allocated strcture. This routine will
|
|
fill out the function pointers w/in the structure
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS.
|
|
|
|
Environment:
|
|
|
|
Must be called at PASSIVE_LEVEL.
|
|
|
|
--*/
|
|
|
|
{
|
|
NTSTATUS status;
|
|
#if DBG
|
|
HANDLE hKey;
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
UNICODE_STRING String;
|
|
#endif
|
|
|
|
CALLTRACE(("NsInitializeShim\n"));
|
|
|
|
if (NULL == pIpSecDeviceObject
|
|
|| NULL == pShimFunctions)
|
|
{
|
|
return STATUS_INVALID_PARAMETER;
|
|
}
|
|
|
|
#if DBG
|
|
//
|
|
// Open the registry key containing debug tracing informatin.
|
|
//
|
|
|
|
RtlInitUnicodeString(&String, NsTraceClassesRegistryPath);
|
|
InitializeObjectAttributes(
|
|
&ObjectAttributes,
|
|
&String,
|
|
OBJ_CASE_INSENSITIVE,
|
|
NULL,
|
|
NULL
|
|
);
|
|
|
|
status = ZwOpenKey(&hKey, KEY_READ, &ObjectAttributes);
|
|
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
UCHAR Buffer[32];
|
|
ULONG BytesRead;
|
|
PKEY_VALUE_PARTIAL_INFORMATION Value;
|
|
|
|
RtlInitUnicodeString(&String, NsTraceClassesEnabledName);
|
|
status =
|
|
ZwQueryValueKey(
|
|
hKey,
|
|
&String,
|
|
KeyValuePartialInformation,
|
|
(PKEY_VALUE_PARTIAL_INFORMATION)Buffer,
|
|
sizeof(Buffer),
|
|
&BytesRead
|
|
);
|
|
|
|
ZwClose(hKey);
|
|
|
|
if (NT_SUCCESS(status)
|
|
&& ((PKEY_VALUE_PARTIAL_INFORMATION)Buffer)->Type == REG_DWORD)
|
|
{
|
|
NsTraceClassesEnabled =
|
|
*(PULONG)((PKEY_VALUE_PARTIAL_INFORMATION)Buffer)->Data;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
status = NsInitializeConnectionManagement();
|
|
if (!NT_SUCCESS(status))
|
|
{
|
|
return status;
|
|
}
|
|
|
|
status = NsInitializePacketManagement();
|
|
if (!NT_SUCCESS(status))
|
|
{
|
|
NsShutdownConnectionManagement();
|
|
return status;
|
|
}
|
|
|
|
status = NsInitializeIcmpManagement();
|
|
if (!NT_SUCCESS(status))
|
|
{
|
|
NsShutdownPacketManagement();
|
|
NsShutdownConnectionManagement();
|
|
return status;
|
|
}
|
|
|
|
status = NsInitializeTimerManagement();
|
|
if (!NT_SUCCESS(status))
|
|
{
|
|
NsShutdownIcmpManagement();
|
|
NsShutdownPacketManagement();
|
|
NsShutdownConnectionManagement();
|
|
return status;
|
|
}
|
|
|
|
NsIpSecDeviceObject = pIpSecDeviceObject;
|
|
pShimFunctions->pCleanupRoutine = NsCleanupShim;
|
|
pShimFunctions->pIncomingPacketRoutine = NsProcessIncomingPacket;
|
|
pShimFunctions->pOutgoingPacketRoutine = NsProcessOutgoingPacket;
|
|
|
|
return STATUS_SUCCESS;
|
|
} // NsInitializeShim
|
|
|
|
|