1
0
mirror of https://github.com/SoftEtherVPN/SoftEtherVPN.git synced 2025-09-20 02:09:25 +03:00

v4.19-9599-beta

This commit is contained in:
dnobori
2015-10-19 21:30:51 +09:00
parent 4e862a7e40
commit d3a1b26413
1085 changed files with 2275 additions and 1979 deletions

View File

@ -442,25 +442,36 @@ NTSTATUS NeoNdisDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp)
if (stack->Parameters.Read.Length == NEO_EXCHANGE_BUFFER_SIZE)
{
// Address check
MDL *mdl = IoAllocateMdl(buf, NEO_EXCHANGE_BUFFER_SIZE, false, false, NULL);
if (mdl != NULL)
bool check_ok = true;
__try
{
MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
ProbeForWrite(buf, NEO_EXCHANGE_BUFFER_SIZE, 1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
check_ok = false;
}
if (NeoIsKernelAddress(buf) == FALSE)
if (check_ok)
{
MDL *mdl = IoAllocateMdl(buf, NEO_EXCHANGE_BUFFER_SIZE, false, false, NULL);
if (mdl != NULL)
{
MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
}
// Read
NeoRead(buf);
Irp->IoStatus.Information = NEO_EXCHANGE_BUFFER_SIZE;
ok = true;
}
if (mdl != NULL)
{
MmUnlockPages(mdl);
IoFreeMdl(mdl);
if (mdl != NULL)
{
MmUnlockPages(mdl);
IoFreeMdl(mdl);
}
}
}
}
@ -485,25 +496,37 @@ NTSTATUS NeoNdisDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp)
if (stack->Parameters.Write.Length == NEO_EXCHANGE_BUFFER_SIZE)
{
// Address check
MDL *mdl = IoAllocateMdl(buf, NEO_EXCHANGE_BUFFER_SIZE, false, false, NULL);
if (mdl != NULL)
bool check_ok = true;
__try
{
MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
ProbeForRead(buf, NEO_EXCHANGE_BUFFER_SIZE, 1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
check_ok = false;
}
if (NeoIsKernelAddress(buf) == FALSE)
if (check_ok)
{
MDL *mdl = IoAllocateMdl(buf, NEO_EXCHANGE_BUFFER_SIZE, false, false, NULL);
if (mdl != NULL)
{
MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
}
ProbeForRead(buf, NEO_EXCHANGE_BUFFER_SIZE, 1);
// Write
NeoWrite(buf);
Irp->IoStatus.Information = stack->Parameters.Write.Length;
ok = true;
}
if (mdl != NULL)
{
MmUnlockPages(mdl);
IoFreeMdl(mdl);
if (mdl != NULL)
{
MmUnlockPages(mdl);
IoFreeMdl(mdl);
}
}
}
}
@ -1387,20 +1410,6 @@ PACKET_BUFFER *NeoNewPacketBuffer()
return p;
}
// Check whether the specified address is kernel memory
BOOL NeoIsKernelAddress(void *addr)
{
#if 0
if ((ULONG)addr >= (ULONG)0x80000000)
{
// Kernel memory
return TRUE;
}
#endif // CPU_64
// User memory
return FALSE;
}
// Reset the event
void NeoReset(NEO_EVENT *event)
{

View File

@ -328,7 +328,6 @@ NEO_EVENT *NeoCreateWin9xEvent(DWORD h);
void NeoFreeEvent(NEO_EVENT *event);
void NeoSet(NEO_EVENT *event);
void NeoReset(NEO_EVENT *event);
BOOL NeoIsKernelAddress(void *addr);
#endif // NEO_DEVICE_DRIVER