add lwIP TCP/IP stack as a runtime driver, native socket syscalls, SysGetMemoryStatus replacing CatchAllDebugBucket, fix timeGetTime to return milliseconds, fix SysSleep to interpret argument as milliseconds, SysGetTick now returns microseconds, harden all syscalls against bad user pointers with CopyFromUser/CopyToUser/MmProbeUser throughout, add networking test apps, port-forward 8080 in runa.bat, split LWIP_DRIVER_CFLAGS, add settings.ini to deploy, remove ethernet.c stub
This commit is contained in:
1 parent
18b4dd0f61
commit
df13b8056c
365 files changed
+143263
-1362
No files matched your search
+31
-16
@@ -257,16 +257,26 @@ void KiCheckForUserApcDelivery(KTRAP_FRAME* frame) {
|
||||
newRsp &= ~(uintptr_t)0xFULL;
|
||||
newRsp -= 8; // make injected dispatcher entry look like a normal call target
|
||||
|
||||
SYS_USER_APC_FRAME_K* userFrame = (SYS_USER_APC_FRAME_K*)newRsp;
|
||||
userFrame->Magic = SYS_USER_APC_FRAME_MAGIC;
|
||||
userFrame->OriginalRip = frame->Rip;
|
||||
userFrame->OriginalRsp = frame->Rsp;
|
||||
userFrame->OriginalRflags = frame->Rflags;
|
||||
userFrame->OriginalRax = STATUS_USER_APC;
|
||||
userFrame->Routine = (uint64_t)(uintptr_t)apc->Routine;
|
||||
userFrame->NormalContext = (uint64_t)(uintptr_t)apc->NormalContext;
|
||||
userFrame->SystemArgument1 = (uint64_t)(uintptr_t)apc->SystemArgument1;
|
||||
userFrame->SystemArgument2 = (uint64_t)(uintptr_t)apc->SystemArgument2;
|
||||
SYS_USER_APC_FRAME_K userFrame;
|
||||
memset(&userFrame, 0, sizeof(userFrame));
|
||||
userFrame.Magic = SYS_USER_APC_FRAME_MAGIC;
|
||||
userFrame.OriginalRip = frame->Rip;
|
||||
userFrame.OriginalRsp = frame->Rsp;
|
||||
userFrame.OriginalRflags = frame->Rflags;
|
||||
userFrame.OriginalRax = STATUS_USER_APC;
|
||||
userFrame.Routine = (uint64_t)(uintptr_t)apc->Routine;
|
||||
userFrame.NormalContext = (uint64_t)(uintptr_t)apc->NormalContext;
|
||||
userFrame.SystemArgument1 = (uint64_t)(uintptr_t)apc->SystemArgument1;
|
||||
userFrame.SystemArgument2 = (uint64_t)(uintptr_t)apc->SystemArgument2;
|
||||
|
||||
KSTATUS s = CopyToUser((void*)newRsp, &userFrame, sizeof(userFrame));
|
||||
if (!KSUCCESS(s)) {
|
||||
uintptr_t flags = KeAcquireSpinlock(&thread->UserApcLock);
|
||||
ListInsertTail(&thread->UserApcQueue, &apc->Link);
|
||||
thread->UserApcPending = 1;
|
||||
KeReleaseSpinlock(&thread->UserApcLock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
frame->Rip = thread->UserApcDispatcher;
|
||||
frame->Rsp = newRsp;
|
||||
@@ -313,7 +323,12 @@ void KiRundownApcState(THREAD* thread) {
|
||||
}
|
||||
|
||||
__declspec(dllexport) uint64_t KeUserApcReturn(const SYS_USER_APC_FRAME_K* userFrame) {
|
||||
if (!userFrame || userFrame->Magic != SYS_USER_APC_FRAME_MAGIC)
|
||||
SYS_USER_APC_FRAME_K frameCopy;
|
||||
KSTATUS s = CopyFromUser(&frameCopy, userFrame, sizeof(frameCopy));
|
||||
if (!KSUCCESS(s))
|
||||
return s;
|
||||
|
||||
if (frameCopy.Magic != SYS_USER_APC_FRAME_MAGIC)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
THREAD* thread = KeGetCurrentThread();
|
||||
@@ -324,12 +339,12 @@ __declspec(dllexport) uint64_t KeUserApcReturn(const SYS_USER_APC_FRAME_K* userF
|
||||
if (!frame || !KeTrapFrameFromUser(frame) || frame->Kind != KTRAP_KIND_SYSCALL)
|
||||
return STATUS_FAILURE;
|
||||
|
||||
frame->Rip = userFrame->OriginalRip;
|
||||
frame->Rsp = userFrame->OriginalRsp;
|
||||
frame->Rflags = userFrame->OriginalRflags;
|
||||
frame->Rax = userFrame->OriginalRax;
|
||||
frame->Rip = frameCopy.OriginalRip;
|
||||
frame->Rsp = frameCopy.OriginalRsp;
|
||||
frame->Rflags = frameCopy.OriginalRflags;
|
||||
frame->Rax = frameCopy.OriginalRax;
|
||||
|
||||
thread->UserApcDeliveryActive = 0;
|
||||
thread->UserApcDeliverable = 0;
|
||||
return userFrame->OriginalRax;
|
||||
return frameCopy.OriginalRax;
|
||||
}
|
||||
Reference in new issue
Block a user