📄 cfgmgr.c
字号:
#include "version.h"
#include "vpn.h"
#ifndef DBG_MESSAGE
#define DBG_MESSAGE 1
#endif
#include "vpndbg.h"
#include "pgpNetKernel.h"
#include "pgpNetKernelXChng.h"
#ifdef CHICAGO
#include "pgpvm.h"
#include "vxdevent.h"
#endif
#ifdef PM_EMULATION
#include "dummypm.h"
#endif
extern PVPN_ADAPTER VpnAdapterGlobal;
const NDIS_OID ConfigManagerSupportedOidList[] =
{
OID_PGP_WIN32_IOCTL,
OID_PGP_EVENT_CREATE,
OID_PGP_EVENT_DESTROY,
OID_PGP_SHARED_MEM_ALLOC,
OID_PGP_SHARED_MEM_FREE,
OID_PGP_NEWCONFIG,
OID_PGP_NEWHOST,
OID_PGP_NEWSA,
OID_PGP_SADIED,
OID_PGP_SAFAILED,
OID_PGP_SAUPDATE,
OID_PGP_ALLHOSTS,
OID_PGP_SHUTDOWN,
OID_PGP_LOCALIP,
OID_PGP_QUEUE_INITIALIZE,
OID_PGP_QUEUE_RELEASE,
#ifdef PM_EMULATION
OID_PGP_NEW_DUMMY_HOST,
OID_PGP_NEW_DUMMY_SA,
#endif PM_EMULATION
OID_PGP_EVENT_SET,
OID_PGP_GET_SEND_PACKETS,
OID_PGP_GET_RECEIVE_PACKETS
};
VOID PgpEventCreate(
IN PPGPEVENT_CONTEXT pPgpEvent
)
{
DBG_FUNC("PgpEventOpen")
#ifdef CHICAGO
DBG_ENTER();
#else
UNICODE_STRING UnicodeName;
WCHAR UnicodeBuffer[128];
DBG_ENTER();
UnicodeName.MaximumLength = sizeof(UnicodeBuffer);
UnicodeName.Length = 0;
UnicodeName.Buffer = UnicodeBuffer;
memset(UnicodeBuffer, 0, sizeof(UnicodeBuffer));
RtlAppendUnicodeToString(&UnicodeName, L"\\BaseNamedObjects\\");
RtlAppendUnicodeToString(&UnicodeName, (PWCHAR) &pPgpEvent->EventName[0]);
pPgpEvent->DriverEventObject = IoCreateSynchronizationEvent(
&UnicodeName,
&pPgpEvent->DriverEventHandle);
if (pPgpEvent->DriverEventObject == NULL)
{
DBG_PRINT(("IoCreateSynchronizationEvent FAILED\n"););
pPgpEvent->DriverEventHandle = NULL;
}
else
{
DBG_PRINT(("SUCCESS Name=%ls\n",pPgpEvent->EventName););
KeClearEvent(pPgpEvent->DriverEventObject);
}
#endif
DBG_LEAVE(0);
}
VOID PgpEventClose(
IN PPGPEVENT_CONTEXT pPgpEvent
)
{
DBG_FUNC("PgpEventClose")
DBG_ENTER();
#ifdef CHICAGO
if (pPgpEvent->DriverEventHandle)
{
_VWIN32_CloseVxDHandle((ULONG)pPgpEvent->DriverEventHandle);
pPgpEvent->DriverEventHandle = NULL;
}
#else
if (pPgpEvent->DriverEventHandle)
{
ZwClose(pPgpEvent->DriverEventHandle);
pPgpEvent->DriverEventObject = NULL;
pPgpEvent->DriverEventHandle = NULL;
}
#endif
DBG_LEAVE(0);
}
VOID PgpEventSet(
IN PPGPEVENT_CONTEXT pPgpEvent
)
{
DBG_FUNC("PgpEventSet")
DBG_ENTER();
#ifdef CHICAGO
if (pPgpEvent->DriverEventHandle != NULL)
{
PVPN_ADAPTER adapter = VpnAdapterGlobal;
NdisUpdateSharedMemory(adapter->NdisAdapterRegistrationHandle,
adapter->SharedMemorySize,
&adapter->SharedMemoryPtr,
&adapter->SharedMemoryPhysicalAddress);
//CallWin32Event((ULONG)pPgpEvent->DriverEventHandle);
NdisSetTimer(&VpnAdapterGlobal->event_timer, 1000 /* 1 second? */);
}
#else
if (pPgpEvent->DriverEventObject != NULL)
{
KeSetEvent(pPgpEvent->DriverEventObject, 0, FALSE);
}
#endif
DBG_LEAVE(0);
}
PVOID PgpMemoryMapWin32Address(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
IN PVOID LinearAddress,
IN ULONG NumBytes,
IN HANDLE ProcessHandle
)
{
DBG_FUNC("PgpMemoryMapWin32Address")
PVOID virtualAddress = NULL;
NTSTATUS ntStatus;
#ifdef CHICAGO
virtualAddress = MemPageLock((ULONG)LinearAddress, NumBytes);
ntStatus = STATUS_SUCCESS;
#else // !CHICAGO
NDIS_STRING physicalMemoryUnicodeString = NDIS_STRING_CONST("\\Device\\PhysicalMemory");
OBJECT_ATTRIBUTES objectAttributes;
HANDLE physicalMemoryHandle = NULL;
PVOID PhysicalMemorySection = NULL;
NDIS_PHYSICAL_ADDRESS viewBase;
DBG_ENTER();
InitializeObjectAttributes(&objectAttributes,
&physicalMemoryUnicodeString,
OBJ_CASE_INSENSITIVE,
(HANDLE) NULL,
(PSECURITY_DESCRIPTOR) NULL);
ntStatus = ZwOpenSection(&physicalMemoryHandle,
SECTION_ALL_ACCESS,
&objectAttributes);
if (!NT_SUCCESS(ntStatus))
{
DBG_PRINT(("!!!!! ZwOpenSection failed\n"););
goto error_out;
}
ntStatus = ObReferenceObjectByHandle(physicalMemoryHandle,
SECTION_ALL_ACCESS,
(POBJECT_TYPE) NULL,
KernelMode,
&PhysicalMemorySection,
(POBJECT_HANDLE_INFORMATION) NULL);
if (!NT_SUCCESS(ntStatus))
{
DBG_PRINT(("!!!!!ObReferenceObjectByHandle failed\n"););
goto close_handle;
}
viewBase = PhysicalAddress;
ntStatus = ZwMapViewOfSection(physicalMemoryHandle,
ProcessHandle,
&virtualAddress,
0L,
NumBytes,
&viewBase,
&NumBytes,
ViewShare,
0,
PAGE_READWRITE | PAGE_NOCACHE);
if (!NT_SUCCESS(ntStatus))
{
DBG_PRINT(("!!!!! ZwMapViewOfSection failed\n"););
goto close_handle;
}
(ULONG) virtualAddress += (ULONG)PhysicalAddress.LowPart -
(ULONG)viewBase.LowPart;
close_handle:
ZwClose(physicalMemoryHandle);
error_out:
#endif // CHICAGO
DBG_LEAVE(ntStatus);
return (virtualAddress);
}
VOID PgpMemoryUnmapWin32Address(
IN PVOID VirtualAddress,
IN ULONG NumBytes,
IN HANDLE ProcessHandle
)
{
DBG_FUNC("PgpMemoryUnmapWin32Address")
DBG_ENTER();
#ifdef CHICAGO
MemPageUnlock((ULONG)VirtualAddress, NumBytes);
#else // !CHICAGO
ZwUnmapViewOfSection(ProcessHandle, VirtualAddress);
#endif // CHICAGO
DBG_LEAVE(0);
}
#ifdef PM_EMULATION
#pragma warning(disable:4035)
#pragma warning(disable:4005)
PGPError
PGPnetPMNewSA(struct _PGPnetPMContext *pContext,
void *data,
UINT dataLen,
ULONG *pSrcBufferLen){}
PGPError
PGPnetPMRemoveSA(struct _PGPnetPMContext *pContext,
void *data,
UINT dataLen,
ULONG *pSrcBufferLen){}
PGPError
PGPnetPMFailedSA(struct _PGPnetPMContext *pContext,
void *data,
UINT dataLen,
ULONG *pSrcBufferLen){}
PGPError
PGPnetPMUpdateSA(struct _PGPnetPMContext *pContext,
void *data,
UINT dataLen,
ULONG *pSrcBufferLen){}
PGPError
PGPnetPMNewHost(struct _PGPnetPMContext *pContext,
void *data,
UINT dataLen,
ULONG *pSrcBufferLen){}
NDIS_STATUS
PGPnetPMNewConfig(struct _PGPnetPMContext *pContext,
void *data,
UINT dataLen,
ULONG *pSrcBufferLen){}
#pragma warning(default:4035)
#pragma warning(default:4005)
#endif
NDIS_STATUS ConfigurationIoctl(
IN PVPN_ADAPTER adapter,
IN NDIS_OID Oid,
IN OUT PVOID InformationBuffer,
IN UINT InformationBufferLength,
IN OUT PUINT BytesWritten,
IN OUT PUINT BytesNeeded
)
{
DBG_FUNC("ConfigurationIoctl")
NDIS_STATUS status;
PVOID SourceBuffer;
ULONG SourceBufferLength;
ULONG GenericULong;
DBG_ENTER();
SourceBuffer = &GenericULong;
SourceBufferLength = sizeof(GenericULong);
switch (Oid)
{
case OID_GEN_SUPPORTED_LIST:
SourceBuffer = (PVOID)ConfigManagerSupportedOidList;
SourceBufferLength = sizeof(ConfigManagerSupportedOidList);
status = NDIS_STATUS_SUCCESS;
break;
case OID_GEN_MAC_OPTIONS:
status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_MEDIA_CAPABILITIES:
status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_MEDIA_SUPPORTED:
status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_GEN_MEDIA_IN_USE:
status = NDIS_STATUS_NOT_SUPPORTED;
break;
case OID_PGP_WIN32_IOCTL:
SourceBuffer = (PVOID)NULL;
SourceBufferLength = 0;
status = NDIS_STATUS_SUCCESS;
break;
case OID_PGP_GET_SEND_PACKETS:
GenericULong = adapter->SendPackets;
status = NDIS_STATUS_SUCCESS;
break;
case OID_PGP_GET_RECEIVE_PACKETS:
GenericULong = adapter->ReceivePackets;
status = NDIS_STATUS_SUCCESS;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -